当前位置: 首页 > article >正文

【java学习—十】HashSet集合(4)

文章目录

  • 1. Java集合概述
  • 2. HashSet
  • 3. 泛型


1. Java集合概述

Java 集合类存放于 java.util 包中,是一个用来存放对象的容器。
① 集合只能存放对象。比如你存一个 int 型数据 1 放入集合中,其实它是自动转换成 Integer类后存入的, Java 中每一种基本类型都有对应的引用类型。
② 集合存放的是多个对象的引用,对象本身还是放在堆内存中。
③ 集合可以存放不同类型,不限数量的数据类型。Java 集合可分为 Set 、 List 和 Map 三种大体系

  • Set :无序、不可重复的集合
  • List :有序,可重复的集合
  • Map :具有映射关系的集合

在 JDK5 之后,增加了泛型, Java 集合可以记住容器中对象的数据类型

2. HashSet

    HashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时都使用这个实现类。我们大多数时候说的 set 集合指的都是HashSet
    HashSet 按 Hash 算法来存储集合中的元素,因此具有很好的存取和查找性能。
HashSet 具有以下特点:
(1)不能保证元素的排列顺序
(2)不可重复(指的是hashcode值不相同)
(3)HashSet 不是线程安全的
(4)集合元素可以使 null
    当向 HashSet 集合中存入一个元素时, HashSet 会调用该对象的 hashCode() 方法来得到该对象的 hashCode 值,然后根据 hashCode 值决定该对象在HashSet 中的存储位置
    如果两个元素的 equals() 方法返回 true ,但它们的 hashCode() 返回值不相等, hashSet 将会把它们存储在不同的位置,但依然可以添加成功。

在这里插入图片描述

举例1:

package day10;

import java.util.HashSet;
import java.util.Set;

public class Test3 {
	public static void main(String[] args) {
		Set set = new HashSet();
		set.add(1);//添加元素
		set.add("a");
		
		System.out.println(set);
		
		set.remove(1);//移除元素
		System.out.println(set);
		
		System.out.println(set.contains("a"));//判断是否包含元素"a"
		System.out.println(set.contains(1));//判断是否包含元素 1
		
		set.clear();//清空集合
		System.out.println(set);
		
	}
}

运行结果:
在这里插入图片描述

举例2:

  1. 使用 Iterator 接口遍历集合元素
    Iterator 接口主要用于遍历 Collection 集合中的元素, Iterator 对象也被称为迭代器
    Iterator 接口隐藏了各种 Collection 实现类的底层细节,向应用程序提供了遍历 Collection 集合元素的统一编程接口
    Iterator 仅用于遍历集合, Iterator 本身并不提供承装对象的能力。如果需要创建 Iterator 对象,则必须有一个被迭代的集合。

  2. 使用 foreach 循环遍历集合元素
    Java 5 提供了 foreach 循环迭代访问 Collection,如:
    for(Person person: persons){
          System.out.println(person.getName ());
    }

package day10;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Test3 {
	public static void main(String[] args) {
		Set set = new HashSet();
		
		set.add("a");
		set.add("b");
		set.add("c");
		set.add("d");
		
		System.out.println(set);
		
		//使用迭代器遍历集合
		Iterator it = set.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}
		
		//for each迭代集合
		for(Object obj : set) {//把set的每一个值取出来,赋值给obj,直到循环set的所有值
			System.out.println(obj);
		}
		
		System.out.println(set.size());//获取集合元素的个数
		
	}
}

运行结果:

在这里插入图片描述

证明:
(1)不能保证元素的排列顺序
(2)不可重复
(4)集合元素可以使 null

package day10;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Test3 {
	public static void main(String[] args) {
		Set set = new HashSet();
		
		set.add("a");
		set.add("b");
		set.add("c");
		set.add("d");
		set.add("d");//再添加一个d//集合存的值是不重复的

		set.add(null);//集合元素可以存null
		
		System.out.println(set);
		//使用迭代器遍历集合
		Iterator it = set.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}
		
		//for each迭代集合
		for(Object obj : set) {//把set的每一个值取出来,赋值给obj,直到循环set的所有值
			System.out.println(obj);
		}
		
		System.out.println(set.size());//获取集合元素的个数
	}
}

运行结果:

在这里插入图片描述
从运行结果看,最后添加的null反而排在了第一个位置,说明(1)不能保证元素的排列顺序(根据hashcode值排序)

HashSet 集合判断两个元素相等的标准:两个对象通过 equals() 方法比较相等,并且两个对象的 hashCode() 方法返回值也相等。
如果两个对象通过 equals() 方法返回 true ,这两个对象的hashCode 值也应该相同。

3. 泛型

package day10;

import java.util.HashSet;
import java.util.Set;

public class Test3 {
	public static void main(String[] args) {
		//Set set = new HashSet();
		Set<Object> set = new HashSet<Object>();//与上面的等价
		set.add("a");
		set.add(1);

		//泛型
		Set<String> set1 = new HashSet<String>();//指定String为集合的泛型,那么这个集合不能存String类型之外的
		set1.add("abc");
//		set1.add(1);//不可以添加String之外的类型
		
	}
}

http://www.kler.cn/a/108860.html

相关文章:

  • 设计模式——策略模式(c++)
  • MySQL远程连接错误解决:Host is not allowed to connect to this MySQL server
  • 《基于深度学习的车辆行驶三维环境双目感知方法研究》
  • 51c视觉~合集6
  • 通过脚本,发起分支合并请求和打tag
  • 【C++】 list 与 string 基础与实现字符串操作
  • Elasticsearch分词器-中文分词器ik
  • C语言之文件操作
  • Affinity Photo 2.2.1 高端专业Mac PS修图软件
  • 前后端交互系统:在Node.js中运行JavaScript
  • Python基础入门例程16-NP16 发送offer(列表)
  • 论文阅读——GPT3
  • AcWing89. a^b
  • vue数组中的变更方法和替换方法
  • 【PG】PostgreSQL客户端认证pg_hba.conf文件
  • 笔记44:Batch_Normlization 过程详解
  • openpnp - Warning - Unknown firmware
  • IEEE Standard for SystemVerilog—Chapter 25.7 Tasks and functions in interfaces
  • GZ035 5G组网与运维赛题第6套
  • eslint识别不了别名解决方法
  • C++可视化 有穷自动机NFA 有穷自动机DFA
  • Linux——文件权限属性和权限管理
  • Python学习——Day11--封装、继承、多态
  • NLP之搭建RNN神经网络
  • Python 框架学习 Django篇 (六) ORM关联
  • Ansible脚本进阶---playbook