本文主要介绍集合框架Set接口下的实现类HashSet底层添加元素机制。
首先,Set接口下的集合的特点一般有三个:无序、不可重复、无索引。
其三个实现类的特点也各有异同
我们也可以再次回顾以前的单列集合体系,以确保我们将这些结构熟记于心。
HashSet底层原理:
1、底层采取哈希表存储
2、哈希表是一种对于增删改查数据性能都好的结构
哈希表组成(不同版本):
JDK8之前:数组+链表
JDK8之后:数组+链表+红黑树
什么是哈希值?
哈希值:对象的整数表现形式
存储时会通过公式计算得到所要存储到的位置
a.首先会创建默认length为16,因子为0.75的数组table,存储时根据公式计算index从而确定存入的位置,前提是必须重写hashCode和equals方法。
b.添加第一个元素,计算得index为4且索引4位置为null,则存储到索引4位置。
c.若又计算到索引4且不为null表示有元素,会有两种情况,首先调用equals方法比较内部属性值是否一致,若一样则不存,反之存入数组,形成链表(若再不为null则继续调用equals比较其内部属性值,一样不存不一样则挂入链表)。
注意:jdk8以前遇到这种情况会采用头插法存入。
注意:jdk8以后采用尾插法存入。
d.加载因子(扩容时机)我们一直没用到,其实就是当table数组存入了16 * 0.75 = 12个元素的时候,table数组会扩容至原来的二倍,也就是长度变为32。
e.当链表长度大于8,数组长度大于等于64的时候(同时满足),当前的链表会自动转为红黑树。
f.所以jdk8之后是数组+链表+红黑树
我们回头再看就会明白HashSet的三个特点为什么是:无序、不可重复、无索引。
无序
不可重复
无索引
希望以上内容能帮助大家更好的理解HashSet底层实现原理!