HashMap和HashSet都采用数组+链表+红黑树进行存储,并且HashSet是由HashMap实现的。
具体的底层实现机制为:
- 创建对象时初始创建数组长度为16,临界值为0.75*16=12。
- 当插入数据时会根据其哈希值进行存储,因此不是顺序存储。
- 经过处理的哈希值(源码中返回)如果不相同,则在数组中添加。
- 如果返回的处理后的哈希值是相同的,则进行equals判断,如果两个对象不相同,则插到链表中,equal相同则进行value值的替换。
- 数组的扩容为2倍扩容,即数组中的数组个数达到临界值的时候,数组进行扩容操作,同时临界值同样变成新数组长度的0.75倍。
- 数组长度最大为64,链表最大长度为8。
- 如果链表达到最大长度,但是数组还没达到64时,还可以对链表进行插入数据,只不过每次链表中插入一个数据都会引起数组的扩容。
- 当数组长度达到64并且数组中有链表长度达到8时(同时满足)则进行树化(转换为红黑树)进行存储。
- 数据类型由
HashMap$Node
转变为HashMap$TreeNode
。