文章目录

  • 一、什么是HashMap?
  • 二、为什么扩容2的n次幂?


一、什么是HashMap?

HashMap是Java中的集合类,是存放键值对形式的数据(Key和Value),例如QQ账号和QQ密码,QQ账号就是Key而密码则是Value
详细可以看这两篇上 HashMap源码剖析(上)——java集合
和下 HashMap源码剖析(下)——java集合

二、为什么扩容2的n次幂?

首先先看一下HashMap中的putVal方法(存值的)和resize方法(扩容的),之所以HashMap扩容是2的n次幂和这两个方法有千丝万缕的联系。

通过putVal方法可以看出来HashMap在存值时会先把key的hash值和扩容后的长度进行一次按位与运算,其中hash是在hash方法中把key进行计算后的出来的结果,n是扩容的长度(也就是数组的长度,默认为16),然后判断是否hash碰撞在进行不同的存储。

通过resize方法可以看出来扩容时会新建一个tab,然后遍历旧的tab,将旧的元素进行e.hash & (newCap - 1)的计算添加进新的tab中,也就是(n - 1) & hash的计算方法,其中n是集合的容量,hash是添加的元素经过hash函数计算出来的hash值。

之所以这样2n扩容和上面的两个方法有极大的关系,首先他们都使用了按位与运算,按位与运算就是把值先变成二进制然后进行运算,如果有0则为0,都为1时则输出为1,HashMap默认容量为16那么在存放到数组时就是n-1也就是15,而15二进制则是1111扩容后为32-1及11111111

,如果都为1的情况下是可以极大的减少hash碰撞,增加效率的。

通过下面例子来看一下当容量为11111111时按位与运算的结果,通过下面的结果可以看出来结果很分散,大大减少了hash碰撞的发生。

再看一下当容量不为11111111而是为其他值的时候,通过下面的结果可以看出,1、2、4跟不同的值进行hash运算但是结果却是相同的,也就是发生了hash碰撞。

同时 确定数组位置的实现是 i=(n-1)& hash,其中 n 代表数组的长度,即map的容量。

当n为2的幂次方时,(n-1)& hash 的值是均匀分布的,我们假设n=16,hash从0开始递增:

当n不为2的幂次方时,(n-1)& hash 的值不是是均匀分布的,我们假设n=15,hash从0开始递增:

由上面可以看出,当我们根据key的hash确定其在数组的位置时,如果n为2的幂次方,可以保证数据的均匀插入,如果n不是2的幂次方,可能数组的一些位置永远不会插入数据,浪费数组的空间,加大hash冲突。
另一方面,一般我们可能会想通过 % 求余来确定位置,这样也可以,只不过性能不如 & 运算。而且当n是2的幂次方时:hash & (length - 1) == hash % length

因此,HashMap 容量为2次幂的原因,就是为了数据的的均匀分布,减少hash冲突,毕竟hash冲突越大,代表数组中一个链的长度越大,这样的话会降低hashmap的性能。

HashMap 容量为2次幂的原因相关推荐

  1. 为什么HashMap默认初始容量为2次幂?不是2次幂会怎样?讲讲 HashMap 扰动函数?

    关于HashMap的详解文章请移步: 链接: HashMap源码研究--源码一行一行的注释 文章目录 为什么初始容量是 2次幂? 如果指定了不是2的次幂的容量会发生什么? 有一个初始容量参数的构造方法 ...

  2. 关于HashMap容量的初始化,还有这么多学问

    转载自 关于HashMap容量的初始化,还有这么多学问 在<HashMap中傻傻分不清楚的那些概念>文章中,我们介绍了HashMap中和容量相关的几个概念,简单介绍了一下HashMap的扩 ...

  3. 关于HashMap容量的初始化,还有这么多学问。

    在<HashMap中傻傻分不清楚的那些概念>文章中,我们介绍了HashMap中和容量相关的几个概念,简单介绍了一下HashMap的扩容机制. 文中我们提到,默认情况下HashMap的容量是 ...

  4. u盘容量变小了是什么原因?怎么恢复数据?

    u盘容量变小了是什么原因?想必大家都用过u盘,这是一款小巧好用的存储设备,但u盘使用久了也会出现一定的问题,如有时候u盘容量变小了,这是什么原因?又该如何去修复u盘里面的文件呢?下面就为大家分享一下u ...

  5. 【集合之HashMap】HashMap实现原理及非线程安全原因

    要知道HashMap是什么,首先要搞清楚它的数据结构,在Java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也 ...

  6. 计算机磁盘管理和容量不一致,官方数据:为什么硬盘可用容量显示错误,以及硬盘容量与实际情况不符的原因...

    购买新的硬盘驱动器时,许会发额吗? 实际上:在硬盘制造商的Windows操作系统中,1TB = 1000×1000×1000 /(1024×1024×1024)≈0.9313GB)通常,硬盘的内部内置 ...

  7. 深入java集合-HashMap

    本文为读书笔记,书籍为java并发编程的艺术 hashmap资料来自b站黑马 文章目录 1.HashMap 1.1 HashMap成员变量 问题: 为什么必须是2的n次幂?如果输入值不是2的幂比如10 ...

  8. 详细理解HashMap数据结构,太齐全了!

    写在前面: 小伙伴儿们,大家好!今天来学习HashMap相关内容,作为面试必问的知识点,来深入了解一波! 思维导图: 1,HashMap集合简介 HashMap基于哈希表的Map接口实现,是以key- ...

  9. HashMap、ConcurrentHashMap源码解读(JDK7/8)

    下载地址(已将图片传到云端,md文件方便浏览更改):https://download.csdn.net/download/hancoder/12318377 推荐视频地址: https://www.b ...

最新文章

  1. Windows Server下DB2自动备份、复原和前滚的脚本编程
  2. java正三角形程序怎么写,java实现正三角形和到正三角形
  3. 《iOS 应用逆向工程:分析与实战》 pdf 电子书分享
  4. 使用SparkJava和Graal的本机微服务
  5. 工作173:数组转换为对象
  6. 37岁程序员被裁员,面试华为阿里被拒,无奈降薪去小公司,结局出乎意料!
  7. springboot项目中jdk版本的问题
  8. tomcat端口被占用的两个解决方法
  9. 对轻量级C++日志类[转]
  10. R count函数_【函数分享】PHP函数str_word_count()分享(202098)
  11. excel不显示0_Excel2007:Excel表格中完整输入身份证号码的几种方法
  12. Python获取最新省市区列表并绘制中国地图(含港澳台)
  13. px、%、em、vw、vh、vmax、vmin、rem区别
  14. dex2oat导致机器很卡的问题分析
  15. Robbers' watch【Codeforces 686 C】【DFS】
  16. 关于宏重复定义的问题分析
  17. 移动互联应用阶段学习
  18. 发育中的小鼠大脑细胞与结构图谱
  19. 巴法络的ts系列服务器,巴法络TS5400D
  20. 作为中国人要知道的一些常识[ZT]

热门文章

  1. 香港十大杰出炒黄金交易平台排名
  2. ROS机器人开机自启动设置
  3. 四十多岁的男人还适合重新创业吗?
  4. 芯片开发流程对应的三大EDA厂商工具
  5. 判断IE版本并给出提示升级浏览器
  6. SQLI DUMB SERIES-1
  7. android loadsvm raw,OpenCV机器学习:Android上利用SVM实现手写体数字识别
  8. APP产品经理(一)
  9. 【PM杂谈】我理解的项目管理
  10. 解决win7 anaconda 安装 Failed to create menus