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次方相关推荐

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

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

  2. hashMap的容量(capacity)为什么必须是是2的n次方

    HashMap的容量(桶的数量)为什么要是2的n次方 查看hashmap的源码可以发现,如果new一个hashmap对象不指定容量(capacity)的话,hashmap的默认初始化容量是16,也就是 ...

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

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

  4. HashMap的容量与扩容

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

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

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

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

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

  7. 硬盘容量计算公式为什么是这个【硬盘容量 = 磁柱数量 * 磁头数量 * 扇区数量 * 512Byte】

    从 <鸟哥的linux私房菜>上看到,计算硬盘容量的这个公式[硬盘容量 = 磁柱数量 * 磁头数量 * 扇区数量 * 512Byte],一开始让我感到一头雾水. 我思维过程是这样的:磁头固 ...

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

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

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

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

最新文章

  1. 【深度学习】(2) 数据加载,前向传播2,附python完整代码
  2. 写给Java程序员的Java虚拟机学习指南
  3. Python——with语句、context manager类型和contextlib库
  4. c++ static 静态变量初始化
  5. Javaweb基础——Servlet
  6. 安卓入门系列-01开发工具Android Studio的安装
  7. 扫描路径_npj: 纳米团簇表面的自动扫描—吸附位点和扩散路径
  8. 调用exe文件(一般处理登陆安全窗口)+睡眠等待(--------------------)
  9. 扩展立方体 The Scale Cube
  10. selenium:断言
  11. 位置路径 usb 获取_USB4规范解读(二):详解USB4的传输路径
  12. 重启iis与mysql服务器吗_每晚定时重启IIS和数据库服务可节省服务器资源
  13. 在Eclipse里自动导入相应包的类名的快捷键
  14. LINUX开发FIREFOX的插件:编译npruntime
  15. 一些python书=待买
  16. 地图瓦片坐标系定义及计算原理
  17. PQ8.05硬盘分区图文教程
  18. Ubuntu下图片转pdf和pdf合并
  19. RuntimeError: CUDA out of memory. Tried to allocate 6.38 GiB (GPU 0; 10.76 GiB total capacity; 708.0
  20. matlab从csv文件中读取时间转换异常

热门文章

  1. Cloud Foundry技术资料汇总
  2. UA MATH524 复变函数17 留数定理
  3. Win32 汇编环境和入门程序图解
  4. Java struts 2 源码阅读入门
  5. java 获得天气预报信息
  6. 学习笔记92—python 画横竖分界线
  7. CodeMirror的使用方法
  8. 算法65----字符串
  9. 致年轻的创业者:人脉没那么重要
  10. Linux中查看端口占用情况及结束相应进程