Set,不允许存储重复元素,没有索引,不能使用普通for循环遍历。
HashSet
实现了Set接口,集合无序且元素不重复,底层是一个哈希表(数组(存哈希值)+链表/红黑树(存元素))。
使用迭代器Iterator遍历:
- 集合对象调用iterator()方法,返回一个Iterator对象。
- 使用while语句,终止条件为iterator.hasNext()
- 使用iterator.next()获取数据。
Iterator<Integer> iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
使用增强for循环遍历:
- for(数据类型 变量名 : 要遍历的集合)
for (Integer integer : set) {
System.out.println(integer);
}
哈希值:一个十进制的整数,系统随机给出,这是模拟出来的逻辑地址,并非数据的实际存储的物理地址。
Set为什么不允许存储重复元素?
Set集合在使用add()方法时,会调用hashCode方法和equals方法,判断元素是否重复。
元素此时存储一个s1元素,此时,它会先调用hashCode方法获取哈希值,然后比较哈希表的数组中是否含有该哈希值,若不存在则将元素存入到集合中。若存在,则调用equals方法,查看链表/红黑树中是否有与这个元素相同的,若equals返回false,则认定不同,返回true则认定元素重复。
注:若HashSet存储自定义类型,必须重写hashCode方法和equals方法。
LinkedHashSet
继承了HashSet,底层是哈希表+链表,我们说过,哈希表是数组+红黑树/链表,此时外层再加一层链表是干什么的呢?这一层链表用于记录存储顺序,因此,LinkedHashSet是一个有序的,但依旧不重复的集合。