一、特点:
(1)不允许包含重复元素
(2)没有索引,没有带索引的方法,也不能使用普通的for循环遍历
二、实现类
1.HashSet特点:
(1)不允许包含重复元素
(2)没有索引,没有带索引的方法,也不能使用普通的for循环遍历
(3)是一个无序的集合,存储元素与取出元素的顺序有可能不一致
(4)底层是一个哈希表结构(查询的速度非常的快)
三、哈希值
1.哈希值是一个十进制整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得到地址,不是数据实际存储的物理地址)
2.在Object类中有一个方法,可以获取对象的哈希值
(1)int hashCode() 返回该对象的哈希码值
(2)hashCode方法的源码:
public native int hashCode();
native:代表该方法调用的是本地操作系统的方法
3.HashSet集合数据存储结构(哈希表)
JDK1.8版本之前:哈希表=数组+链表
JDK1.8版本之后:
哈希表=数组+链表
哈希表=数组+红黑树(提高查询的速度)
哈希表的特点:速度快
4.数组结构:把元素进行了分组(相同哈希值的元素是一组)
链表/红黑树结构把相同哈希值的元素连接到了一起
5.哈希冲突:两个元素不同但是哈希值相同
6.若是链表的长度超过了八位,那么就会把链表转化为红黑树(提高查询的速度)
四、Set集合不允许存储重复集合的原理:
1.Set集合在调用add方法的时候,add方法会调用元素的hashCode方法和equals方法,判断元素是否重复
五、hashSet集合存储自定义类型的元素
1.前提:要重写hashCode方法和equals方法(IDEA可以补全代码)
六、LinkedHashSet集合
1.特点:
(1)具有可预知迭代顺序的set接口的哈希表和链接列表的实现,与HashSet不同在于LinkedHashSet维护着运用于所有条目的双重链接列表
(2)底层是一个哈希表(数组+链表/红黑树)+链表:多了一个链表(记录元素的存储数据,保证元素有序),虽然有序但是也不允许重复
2.与HashSet关系:LinkedHashSet extends HashSet