- hash 函数的实现
在 get 和 put 的过程中,计算下标时,先对 hashCode 进行 hash 操作,然后再通过 hash 值进一步计算下标
- resize 的实现
从 16 扩展为 32 时,具体的变化如下所示:
因此元素在重新计算 hash 之后,因为 n 变为 2 倍,那么 n-1 的 mask 范围在高位多 1 bit (红色),因此新的 index 就会发生这样的变化:
因此,在扩充 HashMap 的时候,不需要重新计算 hash,只需要看看原来的 hash 值新增的那个 bit 是 1 还是 0 就好了。
是 0 的话索引没变,是 1 的话索引变成“原索引 + oldCap”。可以看看下图为 16 扩充为 32 的 resize 示意图:
- HashMap 的底层实现是 数组+链表