什么时候扩容:

当向容器添加元素的时候,会判断当前容器的元素个数,如果大于等于阈值—即当前数组的长度乘以加载因子的值的时候,就要自动扩容啦。
存放新值的时候当前已有元素的个数必须大于等于阈值
存放新值的时候当前存放数据发生hash碰撞
(当前key计算的hash值换算出来的数组下标位置已经存在值)

扩容(resize)

重新计算容量,向HashMap对象里不停的添加元素,而HashMap对象内部的数组无法装载更多的元素时,对象就需要扩大数组的长度,以便能装入更多的元素。当然Java里的数组是无法自动扩容的,方法是使用一个新的数组代替已有的容量小的数组,就像我们用一个小桶装水,如果想装更多的水,就得换大水桶。
Hashmap的扩容需要满足两个条件:当前数据存储的数量(即size())大小必须大于等于阈值;当前加入的数据是否发生了hash冲突。
因为上面这两个条件,所以存在下面这些情况
(1)、就是hashmap在存值的时候(默认大小为16,负载因子0.75,阈值12),可能达到最后存满16个值的时候,再存入第17个值才会发生扩容现象,因为前16个值,每个值在底层数组中分别占据一个位置,并没有发生hash碰撞。
(2)、当然也有可能存储更多值(超多16个值,最多可以存26个值)都还没有扩容。原理:前11个值全部hash碰撞,存到数组的同一个位置(这时元素个数小于阈值12,不会扩容),后面所有存入的15个值全部分散到数组剩下的15个位置(这时元素个数大于等于阈值,但是每次存入的元素并没有发生hash碰撞,所以不会扩容),前面11+15=26,所以在存入第27个值的时候才同时满足上面两个条件,这时候才会发生扩容现象。

HashMap 扩容相关推荐

  1. Btrace详细指南(JDK7,监控HashMap扩容)

    背景     JAVA中如何排查疑难杂症,如何动态获取应用信息,我们有BTrace! PS:集团有大杀器arthas,这里我们先从最原始最广泛的BTrace开始,后面可以玩玩Greys(开源,强于BT ...

  2. hashmap扩容 面试_HashMap面试,看完这一篇就够了(上)

    以下HashMap源码的解析都是基于java8来讲解的. HashMap的结构是数组加链表的形式(jdk7中也是),在java8中引入了红黑树,由于红黑树的时间复杂度是O(log n),引入红黑树是为 ...

  3. hashmap扩容机制_图文并茂:HashMap经典详解!

    点击上方 Java后端,选择 设为星标 优质文章,及时送达 代码中的注解多看几遍,其中HashMap的扩容机制是要必懂知识!结合图片一起理解! 什么是 HashMap? HashMap 是基于哈希表的 ...

  4. hashmap扩容线程安全问题_HashMap在1.7 1.8中的线程安全问题

    HashMap的线程不安全主要体现在下面两个方面: 在JDK1.7中,当并发执行扩容操作时会造成环形链和数据丢失的情况. 在JDK1.8中,在并发执行put操作时会发生数据覆盖的情况. ? ? 常被问 ...

  5. hashmap扩容机制_图文并茂,HashMap经典详解!

    Java面试笔试面经.Java技术每天学习一点 公众号Java面试 关注我不迷路 作者:feigeswjtu 来源:https://github.com/feigeswjtu/java-basics ...

  6. hashmap扩容_面试官问:HashMap在并发情况下为什么造成死循环?一脸懵

    这个问题是在面试时常问的几个问题,一般在问这个问题之前会问Hashmap和HashTable的区别?面试者一般会回答:hashtable是线程安全的,hashmap是线程不安全的. 那么面试官就会紧接 ...

  7. 聊一聊不同技术栈中hashmap扩容机制

    前言 hash简介 作为后端开发,说HashMap是我们最经常接触到的数据结构都不为过,而HashMap如其名最主要依赖的算法就是hash散列算法来存储和读取数据.         以关键码值K为自变 ...

  8. HashMap 扩容 加载因子

    HashMap 扩容 加载因子 最近在看HashMap源码,对于扩容因子=0.75感到很费解,为什么在用了75%的容量的时候就要进行扩容呢?数组中明明还有25%的空间没有使用.为什么不等到数组几乎满了 ...

  9. HashMap扩容改进分析

    HashMap扩容 JDK1.8以后对之前版本的HashMap扩容多线程场景下的死锁的问题进行了解决.采用高低位拆分转移方式,避免了链表的产生. resize()方法扩容部分 for (int j = ...

  10. Java之HashMap系列--HashMap扩容的原理

    原文网址:Java之HashMap系列--HashMap扩容的原理_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Java的HashMap是如何扩容的. 重要大小 类 初始容量 最大容量 扩容 ...

最新文章

  1. ajax异步提交 java_jquery ajax异步提交表单数据的方法
  2. Python使用matplotlib可视化条形图(bar plot)、自定义在条形图的顶部添加数值标签(Bar Chart)
  3. 【Linux】26_文件服务FTP Server
  4. 北斗导航 | Matlab实现GNSS接收机经纬度数据(NMEA语句)实时获取和地图绘制(Matlab源代码)
  5. 利用二分法解决 leetcode 378. Kth Smallest Element in a Sorted Matrix
  6. paddleocr常见问题(3)
  7. PHP CodeBase: 判断用户是否手机访问
  8. jQuery中的attr()与prop()设置属性、获取属性的区别
  9. jQuery文档操作常用方法1
  10. eclispe 下载与安装
  11. python-第三方接口获取验证码
  12. 【STM32H7】第10章 ThreadX GUIX移植到STM32H7(GCC)
  13. 以存储为例说明设备busy的解决方法
  14. C语言:带你轻松干掉 腾讯笔试大题 带环链表
  15. 基于宝塔面板把网站和数据库文件备份到又拍云存储空间图文教程
  16. 自动驾驶/机器人 SLAM算法 面经1
  17. 2016在电影院看过的电影
  18. OpenLayers 3实践与原理探究3-ol3一个完整的例子
  19. 图片base64编码的前端展示及后端解码,编码
  20. 华为虚拟一键部署服务器,服务器一键部署

热门文章

  1. 【​观察】解构中小企业商用市场 ThinkPad推出高效能方案
  2. crmeb直播审核 接口异常【48001】
  3. Chrome 浏览器地址栏显示完整网址 不隐藏http/https的设置方法 83版本可用
  4. android 解析新浪微博json数据
  5. 【Python】Python3网络爬虫实战-24、requests:基本使用
  6. APP修改包名后依然覆盖 注意事项
  7. MySQL建表语句+添加注释
  8. 编程之美--数字1的个数
  9. Premiere不支持MOV怎么办?怎么快速解决?
  10. prim算法_求解最优树——Prim算法与Kruskal算法