Java Set系列集合(Collections集合工具类、可变参数)

时间:2025-02-26 14:33:40

目录

        • Set系列集系概述
        • HashSet集合元素无序的底层原理:哈希表
        • HashSet集合元素去重复的底层原理
        • LinkedHashSet有序实现原理
        • TreeSet
        • Collection集合总结
        • 可变参数
        • Collections集合工具类

Set系列集系概述

Set系列集合特点

  • 无序:存取顺序不一致
  • 不重复:可以去除重复
  • 无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素。

Set集合实现类特点

  • HashSet : 无序、不重复、无索引。
  • LinkedHashSet:有序、不重复、无索引。
  • TreeSet:排序、不重复、无索引。

Set集合的功能上基本上与Collection的API一致。

    public static void main(String[] args) {
   
        Set<String> sets = new HashSet<>(); //一行经典代码︰无序 不重复 无索引
        // set<String> sets = new LinkedHashSet<>();//有序 不重复 无索引
        sets.add("MySQL");
        sets.add ("MySQL");
        sets.add("Java" );
        sets.add ("Java" );
        sets.add("HTML");
        sets.add("HTML");
        sets.add ("springBoot");
        sets.add("springBoot");
        System.out.println(sets);//[Java, MySQL, HTML, springBoot]
    }
HashSet集合元素无序的底层原理:哈希表
  • HashSet集合底层采取哈希表存储的数据。
  • 哈希表是一种对于增删改查数据性能都较好的结构

哈希值:是JDK根据对象的地址,按照某种规则算出来的int类型的数值。
Object类的API:public int hashCode​():返回对象的哈希值
对象的哈希值特点:

  • 同一个对象多次调用hashCode()方法返回的哈希值是相同的
  • 默认情况下,不同对象的哈希值是不同的。

哈希表

  • JDK8之前的,底层使用数组+链表组成
    1. 创建一个默认长度16的数组,数组名table
    2. 根据元素的哈希值跟数组的长度求余计算出应存入的位置(哈希算法)
    3. 判断当前位置是否为null,如果是null直接存入
    4. 如果位置不为null,表示有元素,则调用equals方法比较
    5. 如果一样,则不存,如果不一样,则存入数组,
      • JDK 7新元素占老元素位置,指向老元素
      • JDK 8中新元素挂在老元素下面
  • JDK8开始后,底层采用数组+链表+红黑树组成。
    • 当挂在元素下面的数据过多时,查询性能降低,从JDK8开始后,当链表长度超过8的时候,自动转换为红黑树

哈希表的详细流程

  1. 创建一个默认长度16,默认加载因为0.75的数组,数组名table
  2. 根据元素的哈希值跟数组的长度计算出应存入的位置
  3. 判断当前位置是否为null,如果是null直接存入,如果位置不为null,表示有元素,则调用equals方法比较属性值,如果一样,则不存,如果不一样,则存入数组。
  4. 当数组存满到16*0.75=12时,就自动扩容,每次扩容原先的两倍(32)
HashSet集合元素去重复的底层原理

结论:如果希望Set集合认为2个内容一样的对象是重复的,必须重写对象的hashCode()和equals()方法

    @Override
    public boolean equals(Object o) {
   
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Movie movie = (