为什么在HashMap中使用hash方法

Bat*_*tty 5 java hashmap

Java doc hash方法说明,

检索对象哈希码并将补充哈希函数应用于结果哈希,以防止质量差的哈希函数.这很关键,因为HashMap使用两个幂的长度哈希表,否则会遇到低位不同的hashCodes的冲突.

我无法理解的是,

1)为什么HashMap使用2的幂长度哈希表

在声明表时也说明了这一点:

/**
 * The table, resized as necessary. Length MUST Always be a power of two.
 */
transient Entry<K,V>[] table;
Run Code Online (Sandbox Code Playgroud)

为什么这个约束?

2)否则会遇到低位不相同的hashCode的冲突.意思?

Ger*_*ton 0

当 HashMap 需要调整大小时,它会创建一个新的存储桶数组,使用这些存储桶进行访问hashCode()(通过少量的额外操作将 hashCode 映射int到 hashMap 中的存储桶数量)。
该数组大小的 2 次幂允许将inthashCode 巧妙地映射到存储桶编号 - 基本上仅使用 hashCode 的较低部分(屏蔽较高部分)来寻址存储桶。