标签:下标 HashMap 二进制 哈希 操作 次方 长度
一、均匀分布哈希值 当 HashMap 的长度是 2 的幂次方时,通过 hashCode()计算出哈希值后,再与(length - 1)进行与操作(例如 index = hashCode() & (table.length - 1)),可以使得哈希值更加均匀地分布在数组的下标范围内。 假设哈希值是均匀分布的,那么与操作可以充分利用哈希值的各个位,将哈希值映射到不同的下标位置。例如,如果长度为 16(二进制为 10000),那么与操作会根据哈希值的低四位来确定下标,这样可以使不同的哈希值更有可能映射到不同的下标位置,减少哈希冲突。
(因为hash值是不固定的,所以说key的hash值的二进制数任何位都可能是0或1,如果要保证减少hash碰撞,并且充分占据每个数组的位置,就必须要保证(数组大小-1)的二进制全是1,例如(16-1)的二进制是1111。这样的话,就能保证最后的运算结果,完全取决于hash的二进制数,也就是最后的结果会保证每个位都有可能是0或1。 对于十进制数而言,2的幂次方数-1的二进制数全都是1。)
二、优化计算效率 与操作(&)比取模操作(%)效率更高
在计算下标时,如果长度是 2 的幂次方,那么与操作等价于取模操作,但与操作在计算机硬件层面上通常可以更快地执行。 取模操作可能涉及到除法和余数计算,相对比较耗时。而与操作只需要对二进制位进行简单的逻辑运算,执行速度更快。
三、便于扩容操作 当 HashMap 需要扩容时。
如果长度是 2 的幂次方,扩容后的新长度也是 2 的幂次方,并且只需要将旧的哈希值与新的长度减 1 进行与操作,就可以快速地重新计算元素在新数组中的位置。 这种方式可以避免复杂的重新哈希过程,提高扩容的效率。例如,从长度为 16 扩容到 32,旧的哈希值与 15(1111)进行与操作得到旧下标,新的哈希值与 31(11111)进行与操作得到新下标,这个过程相对简单高效。
标签:下标,
HashMap,
二进制,
哈希,
操作,
次方,
长度
From: https://blog.csdn.net/2301_80114420/article/details/141677982