标签 java 下的文章

你还知道哪些哈希函数的构造方法呢?HashMap中使用的哈希函数构造方法叫做除留取余法(modular hashing):除留取余法是指将关键字key除以一个不大于哈希表长度的正整数p(p <= N),然后取得余数作为地址。在HashMap中,进行了优化和改造,以提高效率和散列的均衡性。

- 阅读剩余部分 -

为什么HashMap的容量是2的倍数呢?有两个主要原因:方便哈希取余运算: 将元素放置在table数组中时,通常是通过计算hash值对数组大小取余来确定位置。在HashMap中,使用了hash值 & (数组大小-1)的位运算来定位元素,与使用取余操作达到相同的效果。而HashMap的容量选择为2的倍数,意味着该数的二进制表示只有一位为1,例如16(二进制为10000),32(二进制为100000),64(二进制为1000000)等。这样,通过将hash值 & (数组大小-1)进行位运算,就可以得到与取余操作相同的效果,并且位运算比取余操作更高效。

- 阅读剩余部分 -

为什么哈希/扰动函数能降hash碰撞?因为key.hashCode()函数调用的是键值类型自带的哈希函数,返回一个int类型的散列值。int类型的取值范围是-2147483648到2147483647,大约40亿个可能的映射空间。尽管哈希函数能够将键值映射得相对均匀松散,使得碰撞的概率很小,但问题是一个长度为40亿的数组是无法放入内存中的。

- 阅读剩余部分 -