HashMap的容量(桶的数量)为什么要是2的n次方

查看hashmap的源码可以发现,如果new一个hashmap对象不指定容量(capacity)的话,hashmap的默认初始化容量是16,也就是24,(1<<4,即1左移4位为二进制1000,即十进制16),源码注释中也指出“Must be a power of two”,也就是“必须是2的幂”,

  /*** The default initial capacity - MUST be a power of two.*/static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

但如果你new一个hashmap时指定的容量不是2的n次方呢?那么Hash会选择大于该数字的第一个2的幂作为容量。(1->2、7->8、9->16)

HashMap<String, String> ch = new HashMap<>(15);//大于15的第一个2的幂即16

那么为什么容量capacity必须是2的n次方呢?

因为hashMap为了存取高效,要尽量较少碰撞,就是要尽量把数据分配均匀,使得每个链表长度大致相同。关键就在于把当前数据存放到哪一个桶中(哪个节点node上),实现这个目标的算法就是取模运算。
但是,在计算机中,直接取模运算的效率不如位运算(&),什么是位运算?就是对于二进制数据的按位运算,1和1才得1,其他都得0,比如:1011 & 1100 = 1000,

sun公司的大牛们发现,当容量为2的n次方时,hash & (capacity - 1) == hash % capacity,于是就在源码中做了优化,通过 hash & (capacity - 1) 来替代取模运算,而前提就是容量必须为2的n次方。
假设:capacity:HashMap的容量(8,二进制为1000), hash:当前key的哈希值(1101), 取模运算为 hash % capacity,
为了方便,我们把这两个二进制取模运算转换为十进制再取模(不考虑二进制的符号位),则运算结果为13%8=5(0101),hash&(capacity-1)=0101(5),所以hash & (capacity - 1) == hash % capacity。

hashMap的容量(capacity)为什么必须是是2的n次方相关推荐

  1. hashmap应用场景_Java初学者进阶系列:HashMap的容量与性能

    1. HashMap的容量与性能 HashMap的性能受到两个参数的影响:初始化容量和负载因子,下面来详细讲述这几个关键问题. 1.1 Initial Capacity与Load Factor Ini ...

  2. hashmap 不释放空间_刁难问题,为什么HashMap默认容量为16加载因子为0.75

    前言:实际开发中我们大多数都是只能new HashMap<>来存储键值对,很少会去设置初始容量,虽然我们知道他的默认容量是16.但是在面试中,为了体现你个人好学的能力,还是会被经常问到为什 ...

  3. 关于HashMap初始化容量问题

    关于HashMap初始化容量问题 使用阿里云代码规范插件扫描后出现以下提示: hashmap should set a size when initalizing,即hashmap应该在初始化时设置一 ...

  4. HashMap的容量与扩容

    阅读JDK源码是提高我们技术很好的途径,其中HashMap的设计是非常优秀的,但是其中定义了许多变量,让人头昏目眩,那么这些变量都是什么意思呢 HashMap中的变量 本篇文章主要关注的字段是DEFA ...

  5. HashMap的容量(桶的数量)为什么要是2的n次方

    2019独角兽企业重金招聘Python工程师标准>>> HashMap为了存取高效,要尽量较少碰撞,就是要尽量把数据分配均匀,每个链表长度大致相同. 关键就在于把当前数据存放到哪一个 ...

  6. 为什么hashmap的容量必须是2的n次幂

    要明白为什么是2的n次幂,这要从hashmap的hash方式说起,hashmap的容量期望就是用来均匀散列存放map中的元素.hashmap根据hash值把元素放到hashmap内部数组的一个位置上. ...

  7. 容量(capacity)

    容量(capacity) 语法: size_type capacity(); capacity()函数返回在重新申请更多的空间前字符串可以容纳的字符数. 这个数字至少与 size()一样大.

  8. java HashMap 极限容量 大小限制 占用内存大小

    我很想知道HashMap到底极限容量是多少呢?搜了很久,没找到答案.也懒得继续找了~~~ 反正应该很大很大~~ 但HashMap占内存比较大,不少人都更关注于HashMap所占的内存怎么计算. 运行了 ...

  9. hashmap为什么容量是2的n次方

    我们知道在hashmap中要找到某个元素,需要根据key的hash值来求得对应数组中的位置.如何计算这个位置就是hash算法.前面说过hashmap的数据结构是数组和链表的结合,所以我们当然希望这个h ...

最新文章

  1. 磁棒 锰锌铁氧体高频磁条22x5x3mm,作为天线性能测试
  2. python左移位运算_python移位运算符
  3. DevExpress 动态换肤
  4. Openstack部署工具
  5. Java初学者不得不知的概念,JDK,JRE,JVM的区别?
  6. AD-查找符合指定条件的用户Get-User
  7. 牛客题霸 [螺旋矩阵] C++题解/答案
  8. app爬虫Android 7证书设置
  9. cupsd进程_linux pstree命令显示正在运行的进程的进程树状图
  10. mfc ajax爬虫,另辟蹊径,爬取Ajax数据内容
  11. 镜像miracast投屏软件_miracast投屏下载
  12. The proxy server is refusing connections 怎么解决呢?
  13. 两款扒站工具使用说明
  14. JSP内置对象及其常用方法
  15. 51单片机dds信号发生器 扫频 c语言,基于DDS正弦信号发生器设计.doc
  16. 不要因为英语和数学而害怕学习编程.
  17. XtraReport通过动态设置打印模板进行标签打印
  18. H265框架编码流程(一),网易Android面试必问
  19. databasedt
  20. 如何用matlab画出正螺面,matlab中的螺旋网格

热门文章

  1. echo和narcissus寓意_Echo和Narcissus的故事
  2. 软件测试工程师高频面试题
  3. 认识微型计算机的组成课件,认识微型计算机说课课件
  4. Python使用requests库post文件multipart编码格式
  5. 反向投影 matlab,【matlab】雷達成像系列 之 BP(BackProjection,后向投影) 成像算法...
  6. 台式电脑网络连接配置异常_看完才明白,电脑一体机和台式机哪个好?
  7. underlay和overlay网络介绍
  8. 论中职学校计算机教学,浅析中职学校计算机教学论文
  9. RowMapper是什么?怎么用?
  10. Leetcode 557 反转字符串中的单词