目录
Set集合概述特点
所在包:java.util
public interface Set<E>
extends Collection<E>
//Set作为接口不能直接进行实例化,必须找到Set相应的实现类。
特点:不包含重复元素的集合
Set集合中没有带索引的方法,所以不能使用普通for循环遍历
注意:
数组用Arrays类方法
集合用Collections类方法
实现代码案例:
Set<String> s = new HashSet<String>();
s.add("hello");
s.add("world");
s.add("java");
for(String c:s){
System.out.print(c); //Set对集合的迭代顺序不做任何保证
}
输出结果:
world
java
hello
哈希值概述特点
哈希值:
- 是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值
- Object类中有hashCode()可以获取对象的哈希值:public Object hashCode()返回对象的哈希值
对象的哈希值特点:
- 同一个对象多次调用hashCode()方法返回的哈希值是相同的
- 默认情况下(没有在类中重写hashCode()方法的情况下),不同对象的哈希值是不同的,重写hashCode()方法可以让不同对象的哈希值相同
HashSet< E >
所在包:java.util
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>,Cloneable,Serializable
特点:
- 底层数据结构是哈希表
- 对集合的迭代顺序不做任何保证,也就是说不保证存储数据和取出数据的元素顺序一致
- 没有带索引的方法,所以不能用普通for循环遍历
- 由于是Set集合,所以在集合中不包含重复的元素
初始化格式:
HashSet<E> hs=new HashSet<E>();
注意:HashSet继承了Set接口所以可以用add、remove、clear、isEmpty、iterator(获取迭代器)等方法
HashSet是如何保证元素不相同的:
- 存入的元素和已经存入的元素比较哈希值
- 如果哈希值不同,则继续向下执行,把元素添加到集合
- 如果哈希值相同,则调用对象的equals方法进一步比较元素值是否相同
- 如果equals返回false,则会继续向下执行,把元素添加到集合
- 如果equals返回true,则说明元素重复,不会向下执行
图例:
存储学生对象案例:
public static void main(String[] args){
HashSet<Student> h = new HashSet<Student>();
Student s1=new Student("张三",123,99);
Student s2=new Student("李四",456,98);
Student s3=new Student("王五",789,70);
Student s4=new Student("张三",123,99);
h.add(s1);
h.add(s2);
h.add(s3);
h