同样继承自 Collection 接口,它与 Collection 接口中的方法基本一致,
并没有对 Collection 接口进行功能上的扩充,只是比 Collection 接口更加严格了。
与 List 接口不同的是, Set 接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。
没有索引,也没有带索引的方法,也不能使用普通的for循环。
HashSet
java.util.HashSet 底层的实现其实是一个 java.util.HashMap 支持。
1、是一个无序的集合,存储元素和取出元素的顺序有可能不一致
2、底层是一个哈希表结构(查询的速度非常快)
哈希值
是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来的,不是数据实际存储的物理地址)
在Object类有一个方法,可以获取对象的哈希值。
int hashCode()反对该对象的哈希码值
native:代表该方法调用的是本地操作系统的方法
哈希表
在JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。
但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。
而JDK1.8中,哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。
HashSet存储自定义类型元素
给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一。
LinkedHashSet
在HashSet下面有一个子类 java.util.LinkedHashSet ,它是链表和哈希表组合的一个数据存储结构。
特点:
底层是一个哈希表(数组+链表/红黑树)+链表:多了一条链表(记录元素的存储顺序),保证元素有序