目录
-
-
-
- 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之前的,底层使用数组+链表组成
- 创建一个默认长度16的数组,数组名table
- 根据元素的哈希值跟数组的长度求余计算出应存入的位置(哈希算法)
- 判断当前位置是否为null,如果是null直接存入
- 如果位置不为null,表示有元素,则调用equals方法比较
- 如果一样,则不存,如果不一样,则存入数组,
- JDK 7新元素占老元素位置,指向老元素
- JDK 8中新元素挂在老元素下面
- JDK8开始后,底层采用数组+链表+红黑树组成。
- 当挂在元素下面的数据过多时,查询性能降低,从JDK8开始后,当链表长度超过8的时候,自动转换为红黑树
哈希表的详细流程
- 创建一个默认长度16,默认加载因为0.75的数组,数组名table
- 根据元素的哈希值跟数组的长度计算出应存入的位置
- 判断当前位置是否为null,如果是null直接存入,如果位置不为null,表示有元素,则调用equals方法比较属性值,如果一样,则不存,如果不一样,则存入数组。
- 当数组存满到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 = (