HashMap的容量(桶的数量)为什么要是2的n次方
2019独角兽企业重金招聘Python工程师标准>>>
HashMap为了存取高效,要尽量较少碰撞,就是要尽量把数据分配均匀,每个链表长度大致相同。
关键就在于把当前数据存放到哪一个桶中,这个算法就是取模运算。
假设:
length:HashMap的容量
hash:当前key的哈希值
取模运算为 hash % length
但是,在计算机中,直接取模运算的效率不如位运算(&),什么是位运算?就是对于二进制数据的按位运算,1和1才得1,其他都得0,比如:1011 & 1100 = 1000
sun公司的大牛们发现,当容量为2的n次方时,hash & (length - 1) == hash % length ,于是就在源码中做了优化,通过 hash & (length - 1) 来替代取模运算,而前提就是容量必须为2的n次方。这样做的好处在于:
1. 提高操作运算效率(位运算效率 > 取模运算效率)
2. 减少碰撞,数据均匀分布,提高HashMap查询效率
为什么可以减少碰撞?举个例子,现在两个hash分别是2和3,:
比如 length 为 9 的情况:3&(9-1)=0 2&(9-1)=0 ,都在0上,碰撞了;
比如 length 为 8 的情况:3&(8-1)=3 2&(8-1)=2 ,不同位置上,不碰撞;
转载于:https://my.oschina.net/edwardge/blog/1844438
HashMap的容量(桶的数量)为什么要是2的n次方相关推荐
- 关于HashMap初始化容量问题
关于HashMap初始化容量问题 使用阿里云代码规范插件扫描后出现以下提示: hashmap should set a size when initalizing,即hashmap应该在初始化时设置一 ...
- hashMap的容量(capacity)为什么必须是是2的n次方
HashMap的容量(桶的数量)为什么要是2的n次方 查看hashmap的源码可以发现,如果new一个hashmap对象不指定容量(capacity)的话,hashmap的默认初始化容量是16,也就是 ...
- 为什么hashmap的容量必须是2的n次幂
要明白为什么是2的n次幂,这要从hashmap的hash方式说起,hashmap的容量期望就是用来均匀散列存放map中的元素.hashmap根据hash值把元素放到hashmap内部数组的一个位置上. ...
- HashMap的容量与扩容
阅读JDK源码是提高我们技术很好的途径,其中HashMap的设计是非常优秀的,但是其中定义了许多变量,让人头昏目眩,那么这些变量都是什么意思呢 HashMap中的变量 本篇文章主要关注的字段是DEFA ...
- hashmap应用场景_Java初学者进阶系列:HashMap的容量与性能
1. HashMap的容量与性能 HashMap的性能受到两个参数的影响:初始化容量和负载因子,下面来详细讲述这几个关键问题. 1.1 Initial Capacity与Load Factor Ini ...
- hashmap 不释放空间_刁难问题,为什么HashMap默认容量为16加载因子为0.75
前言:实际开发中我们大多数都是只能new HashMap<>来存储键值对,很少会去设置初始容量,虽然我们知道他的默认容量是16.但是在面试中,为了体现你个人好学的能力,还是会被经常问到为什 ...
- 硬盘容量计算公式为什么是这个【硬盘容量 = 磁柱数量 * 磁头数量 * 扇区数量 * 512Byte】
从 <鸟哥的linux私房菜>上看到,计算硬盘容量的这个公式[硬盘容量 = 磁柱数量 * 磁头数量 * 扇区数量 * 512Byte],一开始让我感到一头雾水. 我思维过程是这样的:磁头固 ...
- java HashMap 极限容量 大小限制 占用内存大小
我很想知道HashMap到底极限容量是多少呢?搜了很久,没找到答案.也懒得继续找了~~~ 反正应该很大很大~~ 但HashMap占内存比较大,不少人都更关注于HashMap所占的内存怎么计算. 运行了 ...
- hashmap为什么容量是2的n次方
我们知道在hashmap中要找到某个元素,需要根据key的hash值来求得对应数组中的位置.如何计算这个位置就是hash算法.前面说过hashmap的数据结构是数组和链表的结合,所以我们当然希望这个h ...
最新文章
- 【深度学习】(2) 数据加载,前向传播2,附python完整代码
- 写给Java程序员的Java虚拟机学习指南
- Python——with语句、context manager类型和contextlib库
- c++ static 静态变量初始化
- Javaweb基础——Servlet
- 安卓入门系列-01开发工具Android Studio的安装
- 扫描路径_npj: 纳米团簇表面的自动扫描—吸附位点和扩散路径
- 调用exe文件(一般处理登陆安全窗口)+睡眠等待(--------------------)
- 扩展立方体 The Scale Cube
- selenium:断言
- 位置路径 usb 获取_USB4规范解读(二):详解USB4的传输路径
- 重启iis与mysql服务器吗_每晚定时重启IIS和数据库服务可节省服务器资源
- 在Eclipse里自动导入相应包的类名的快捷键
- LINUX开发FIREFOX的插件:编译npruntime
- 一些python书=待买
- 地图瓦片坐标系定义及计算原理
- PQ8.05硬盘分区图文教程
- Ubuntu下图片转pdf和pdf合并
- RuntimeError: CUDA out of memory. Tried to allocate 6.38 GiB (GPU 0; 10.76 GiB total capacity; 708.0
- matlab从csv文件中读取时间转换异常