集合-Set

1.基本概述

  • Set接口是Collection的子接口,set接口没有提供额外的方法。但是比Collection接口更加严格了。

2.特点

  1. Set 集合不允许包含相同的元素,即元素唯一。
  2. Set集合支持的遍历方式和Collection集合一样:foreach和Iterator。
  3. Set的常用实现类有:HashSet、TreeSet、LinkedHashSet。

3.HashSet

  • HashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时都使用这个实现类。

  • 特点

    1. 无序:

      • 不是按照添加顺序展示
      • hash表内的顺序进行展示
    2. 唯一

      • 数据不能重复
    3. 注意:

      • 存储自定义类型数据 必须 重写 hashCode() equals() 才能保证 无序唯一

      • 存储自定义类型数据 有自定义属性 那么属性也需要重写 hashCode() equals() 才能保证 无序唯一

  • HashSet 集合判断两个元素相等的标准:

    • 两个对象通过 hashCode() 方法比较相等,
    • 且两个对象的 equals() 方法返回值也相等。
    • 因此,存储到HashSet的元素要重写hashCode和equals方法。

4.LinekdHashSet

  • LinkedHashSet是HashSet的子类,它在HashSet的基础上,在结点中增加两个属性before和after维护了结点的前后添加顺序。

  • 是链表和哈希表组合的一个数据存储结构。

  • LinkedHashSet插入性能略低于 HashSet,但在迭代访问 Set 里的全部元素时有很好的性能。

  • 特点

    1. 有序

      • 添加顺序
        1. after:后一个
        2. before:前一个
    2. 唯一

      • 数据不重复
    3. 注意

      • 存储自定义类型数据 有自定义属性 那么属性也需要重写 hashCode() equals() 才能保证 无序唯一
      • LinekdHashSet 有序:底层有对象的前一个值和后一个值的地址引用

5.TreeSet

  • 底层结构:

    • 里面维护了一个TreeMap,都是基于红黑树实现的。
  • 特点

    1. 有序

      • 自然顺序(从小到大)
    2. 唯一

      • 数据不能重复
      • 根据比较规则确定重复的条件
        • 比如:年龄比较 年龄一致对象重复
  • 如何实现去重的?如何排序?

    • 如果TreeSet中的元素要实现元素唯一和排序,那么这些元素就必须是可以进行比较的,如何保证元素可比较呢?要么元素本身实现Comparable接口,从而实现可比较;要么给TreeSet容器传入一个实现了Comparator接口的比较器,使其可以对存入的元素进行比
  • 比较规则(部分例子)

    • Java提供的核心类很多都实现了Comparable接口比如常见的String类,包装类,日期类等
    • BigDecimal、BigInteger 以及所有的数值型对应的包装类:按它们对应的数值大小进行比较
    • Character:按字符的 unicode值来进行比较
    • Boolean:true 对应的包装类实例大于 false 对应的包装类实例
    • String:从第一个字符开始,比较每一个字符,如果字符都相同再比较长度。
    • Date、Time:比较毫秒值,后边的时间、日期比前面的时间、日期大
posted @ 2021-11-19 11:17  KaneQi  阅读(19)  评论(0编辑  收藏  举报