https://www.itcast.cn/news/20220913/18093278812.shtml

首先,HashMap的初始化的数组长度一定是2的n次的,每次扩容仍是原来的2倍的话,就不会破坏这个规律,每次扩容后,原数据都会进行数据迁移,根据二进制的计算,扩容后数据要么在原来位置,要么在【原来位置+扩容长度】,这样就不需要重新hash,效率上更高。

HashMap中,如果想存入数据,首先它需要根据key的哈希值去定位落入哪个桶中。

HashMap的做法,我总结的是,三步:>>>无符号右移、^异或、&与

具体是:拿着key的哈希值,先“>>>”无符号右移16位,然后“^”异或上key的哈希值,得到一个值,再拿着这个值去“&”上数组长度减一

最后得出一个数(如果数组长度是15的话,那这个数就是一个0-15之间的一个数),这个数就是得出的数组脚标位置,也就是存入的桶的位置。

由上边可以知道,定位桶的位置最后需要做一个 “&” 与运算,&完了得出一个数,就是桶的位置

知道了这些以后,再来说为什么HashMap的长度之所以一定是2的次幂?

至少有以下两个原因:

1、HashMap 的长度是 2 的次幂的话,可以让数据更散列更均匀的分布,更充分的利用数组的空间