• 集合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:比较毫秒值,后边的时间、日期比前面的时间、日期大
    作者:Ya
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Ad hoc access to OLE DB provider 'Microsoft.ACE.OLEDB.12.0' has been denied. You must access this provider through a linked server.
    阻塞问题:会话是sleeping的,但是open_tran 不是0
    windows Server DNS服务器配置
    内存缺页
    "ros::NodeHandle"的用法:全局vs.私有
    python 判断当前执行用户是否是 root 用户
    docker 安装及启动 postgresql 及navicat 连接
    Mac 在环境变量中隐藏密码或者密钥等信息
    磁盘空间不足导致虚拟机无法启动
    VirtuaBox 下安装 Centos8 无法上网
  • 原文地址:https://www.cnblogs.com/1463490Ya/p/15526821.html
Copyright © 2020-2023  润新知