可点击此处:HashSet在底层原理
-
创建一个默认长度16,默认加载因子为0.75的数组,数组名table
16*0.75 = 12,如果存入的数据达到12,则数组自动扩容为原来的2倍
-
根据元素的哈希值跟数组的长度计算出应存入的位置
int index = (数组长度-1) & 哈希值;
-
如果位置为null,直接存入
-
如果位置不为null 表示有元素,则调用equals方法比较属性值
一样;不存 不一样:存入数组,形成链表
jdk8以前:新元素存入数组,老元素挂在新元素下面
jdk8以后:新元素直接挂在老元素下面
-
jdk8以后,当链表长度超过8,且数组长度大于等于64时,链表自动转换为红黑树。
-
如果集合中存储的时自定义对象,必须重写hashCode方法和equals方法。
HashSet是利用什么机制保证去重?
- 利用HashCode方法和equals方法
- HashCode方法来计算出哈希值,根据哈希值计算机出要元素要存入的位置,然后再调用equals方法比较对象内部的属性值是否一样
HashSet为什么存和取的顺序不一样?
HashSet为什么没有索引?