HashMap 是怎样扩容的?为什么容量是 2 的幂?
先自己想一想,再看参考要点
参考要点
- 插入后 size 大于 threshold(capacity × 0.75)时容量翻倍,默认 16 时放入第 13 个键后变为 32
- 扩容时按 hash & oldCap 是否为 0 把节点分到 j 和 j + oldCap 两个位置,保持相对顺序
- 容量是 2 的幂时,hash & (capacity - 1) 只保留 hash 的低位,hash 非负时与 hash % capacity 相同(hash 为负时 % 可能得到负数,与运算仍是合法下标),位运算比取模快,扩容也只需看一位
- 长度不是 2 的幂时 length - 1 中有为 0 的位,一部分桶永远用不到