首先要了解:Hashset的底层为Hashmap,而Hashmap的底层是数组+链表+红黑树(如下图):
以下将数组加链表的整体称作数据表。
Hashset扩容机制:
- 添加一个元素时,先得到hash值,再将hash值转化为索引值(放在数组的哪个位置)。
- 找到数据表,查看该索引的位置是否有元素。
- 若没有元素,则直接添加。若有元素,则调用equals()方法比较,如果相同,则不添加,若不同,则加在尾部(即链表里边)。
- (jdk8中):当链表中元素的个数达到8,同时数组中的个数超过64时,就会进化成红黑树(进一步提高查询效率)。 注:若链表中元素的个数到8,而数组未到64,则按数组容量*2进行扩容,直到扩容到64,再树化。
注:
1 . 第一次添加时,系统会扩容到16,阈值为加载因子(0.75)16=12。
2 .当整个数据表中的元素个数达到12,在将要插入第十三个元素时,会触发数组扩容(162),此时阈值变为32*0.75=24.以此类推,直到数组容量达到64,则树化。