为什么 HashMap 的容量是 2 的整次幂?

首先我们要知道元素定位原理

HashMap 在定位元素位置时,先通过 hash(key) = (h = key.hashCode()) ^ (h >>> 16) 计算出哈希值,再通过 hash & (n-1) 来定位元素位置的,n 为数组的大小,也就是 HashMap 的容量。

原因一:更快的数组下标定位

数组下标的计算原是要通过取模得到的。在容量是 2 的整次幂时,hash & (n - 1) = hash % n,取模可以被位运算代替,提升定位速度。

原因二:使元素分布更加均匀

在容量是 2 的整次幂时, (n - 1) 是奇数,对应的二进制最后一位是 1,从而 hash & (n - 1) 的最后一位可能为 0,也可能为 1(取决于 hash 的值),即 & 运算后的结果可能为偶数,也可能为奇数,可以使元素分布更加均匀

【补充】

在 JDK 8 的新 hash 算法下,数组扩容后的索引位置遵循一定的规律。
在进行数组扩容后元素重新定位时,只需要判断元素哈希值的高位中新增的那一位有效位是否为 1 即可。如果是 1,移动该元素到原位置加旧容量的位置;如果是 0,则保持在原位置

相关推荐

  1. 为什么 HashMap 容量 2

    2024-07-19 08:08:02       16 阅读
  2. leetcode231 判断一个给定整数是否2n

    2024-07-19 08:08:02       45 阅读
  3. leetcode-2

    2024-07-19 08:08:02       49 阅读
  4. [leetcode] 2

    2024-07-19 08:08:02       29 阅读
  5. [C/C++入门][循环]14、计算2(2n方)

    2024-07-19 08:08:02       20 阅读
  6. 【面试题】i&(i-1)判断n是否为2

    2024-07-19 08:08:02       82 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 08:08:02       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 08:08:02       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 08:08:02       57 阅读
  4. Python语言-面向对象

    2024-07-19 08:08:02       68 阅读

热门阅读

  1. C++编程逻辑讲解step by step:利用文档类处理数据

    2024-07-19 08:08:02       20 阅读
  2. 【Oracle】Oracle中的LISTAGG函数

    2024-07-19 08:08:02       19 阅读
  3. new和malloc

    2024-07-19 08:08:02       21 阅读
  4. Redis 地理位置 GEO 模块

    2024-07-19 08:08:02       21 阅读
  5. 一文理解ThreadPoolExecutor线程池以及运行时间

    2024-07-19 08:08:02       20 阅读
  6. AccessibilityEvent常用事件

    2024-07-19 08:08:02       19 阅读
  7. vue3封装el-table及实现表头自定义筛选

    2024-07-19 08:08:02       19 阅读
  8. jEasyUI 显示海量数据

    2024-07-19 08:08:02       19 阅读
  9. 团队高效地使用 Git 进行协同开发

    2024-07-19 08:08:02       20 阅读
  10. ArrayList

    2024-07-19 08:08:02       21 阅读