1.基本概述
- Set接口是Collection的子接口,set接口没有提供额外的方法。但是比Collection接口更加严格了。
2.特点
- Set 集合不允许包含相同的元素,即元素唯一。
- Set集合支持的遍历方式和Collection集合一样:foreach和Iterator。
- Set的常用实现类有:HashSet、TreeSet、LinkedHashSet。
3.HashSet
-
HashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时都使用这个实现类。
-
特点
-
无序:
- 不是按照添加顺序展示
- hash表内的顺序进行展示
-
唯一
- 数据不能重复
-
注意:
-
存储自定义类型数据 必须 重写 hashCode() equals() 才能保证 无序唯一
-
存储自定义类型数据 有自定义属性 那么属性也需要重写 hashCode() equals() 才能保证 无序唯一
-
-
-
HashSet 集合判断两个元素相等的标准:
- 两个对象通过 hashCode() 方法比较相等,
- 且两个对象的 equals() 方法返回值也相等。
- 因此,存储到HashSet的元素要重写hashCode和equals方法。
4.LinekdHashSet
-
LinkedHashSet是HashSet的子类,它在HashSet的基础上,在结点中增加两个属性before和after维护了结点的前后添加顺序。
-
是链表和哈希表组合的一个数据存储结构。
-
LinkedHashSet插入性能略低于 HashSet,但在迭代访问 Set 里的全部元素时有很好的性能。
-
特点
-
有序
- 添加顺序
- after:后一个
- before:前一个
- 添加顺序
-
唯一
- 数据不重复
-
注意
- 存储自定义类型数据 有自定义属性 那么属性也需要重写 hashCode() equals() 才能保证 无序唯一
- LinekdHashSet 有序:底层有对象的前一个值和后一个值的地址引用
-
5.TreeSet
-
底层结构:
- 里面维护了一个TreeMap,都是基于红黑树实现的。
-
特点
-
有序
- 自然顺序(从小到大)
-
唯一
- 数据不能重复
- 根据比较规则确定重复的条件
- 比如:年龄比较 年龄一致对象重复
-
-
如何实现去重的?如何排序?
- 如果TreeSet中的元素要实现元素唯一和排序,那么这些元素就必须是可以进行比较的,如何保证元素可比较呢?要么元素本身实现Comparable接口,从而实现可比较;要么给TreeSet容器传入一个实现了Comparator接口的比较器,使其可以对存入的元素进行比
-
比较规则(部分例子)
- Java提供的核心类很多都实现了Comparable接口比如常见的String类,包装类,日期类等
- BigDecimal、BigInteger 以及所有的数值型对应的包装类:按它们对应的数值大小进行比较
- Character:按字符的 unicode值来进行比较
- Boolean:true 对应的包装类实例大于 false 对应的包装类实例
- String:从第一个字符开始,比较每一个字符,如果字符都相同再比较长度。
- Date、Time:比较毫秒值,后边的时间、日期比前面的时间、日期大