HashSet底层的数据结构是哈希表(Node数组+链表+红黑树)。
所以HashSet新增元素可以分为一下几个步骤:
1.计算新增元素的哈希值。
2.用计算出来的哈希值%(模)数组长度来确定新增元素的索引值位置。
3.判断该索引值位置是否有元素。
①若没有元素,则直接新增该元素到该索引值位置。
②若该索引值位置有元素,则判断要新增的元素是否重复。
a.若重复则不新增。
b.若不重复,则将该元素挂在该索引值下链表的最末端。
需要注意的是:
1.Node数组的初始长度为16,经过自动扩容后其新容量 = 旧容量*2。
扩容条件:
a.当元素的个数占满数组长度的75%时。
b.当某个索引值位置下的元素个数 > 8 且数组长度 < 64的时候。
(当某个索引值位置下的元素个数>8且数组长度>64的时候,会将该索引值下的链表转为红黑树)
2.判断元素是否重复的标准:
原码是这样写的:p.hash == hash && ((k = p.key) == key || (key ! = null && key.equals(k)))
即要新增的元素对比该索引值位置下原来的元素,哈希值相等,并且地址值或者内容相等才算是重复元素。