HashMap底层及实现原理

HashMap---->存储数据----->这些数据一定在计算机的底层----->存储的方式(数据结构)

HashMap的存储方式是 :数组+链表

默认长度16。他的默认长度写法:1<<4,因为2进制语言是计算机底层语言所以直接用唯一了

为什么默认长度是16?

因为在计算位置的时候采用得是code%(changdu-1)二进制,而15的二进制是1111,它可以很好的分散数据。而16也是一个稍微刚好的容量,所以采用了16.

节点的位置到底存在哪?怎么得来了

节点的位置通过hashcode(key)的二进制数,然后再把前十六位和后十六位进行一下移位,与默认长度-1的二进制进行&运算。判断出在哪个下标

为什么不等到16在进行扩容?

因为如果等到16在进行扩容的化,会造成数据过多,以及链表过长,导致效率下降

为什么这个因子是0.75?

去了时间复杂度和空间复杂度的平均值

扩容的机制:数组的大小乘以0.75

链表数组的改变:改成红黑树,当链表的长度大于8时改成红黑树,当链表长度小于6时,变成单链表

扩容机制的时候,怎样进行扩容?

首先先判段是否是首次扩容,也就是集合是否为空,如果为空,则不需要进行数据迁移,如果不为空,则通过两层循环进行扩容,外层循环时首先判断改数组是否为空,如果是空则不进行,然后再进行一层判断,判断是否是红黑树的形式,如果是则以红黑树的形式进行迁移,如果不是,则判断该节点处在哪个位置(用的机制是code与扩容前的数组长度(不是减一后的例如:16)进行与运算,如果最前的一位是1,则把该元素的位置向后+扩容前的数组长度,否则不变)。

猜你喜欢

转载自blog.csdn.net/qq_42430767/article/details/84847191