社区
Java SE
帖子详情
HashMap扩容的这一步怎么理解
天涯with0
2019-11-17 11:36:11
这一步的扩容阈值不应该是数组长度*加载因子吗?为什么非得当前数组长度<default_inital_capacity时扩容阈值才等于长度*加载因子呢
...全文
545
2
打赏
收藏
HashMap扩容的这一步怎么理解
这一步的扩容阈值不应该是数组长度*加载因子吗?为什么非得当前数组长度<default_inital_capacity时扩容阈值才等于长度*加载因子呢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
一个帅逼
2019-11-22
打赏
举报
回复
你这文档看着应该就是jdk1.8的hashMap,但是好像有点问题,看源码是如果你重载了负载因子和底层初始化数组长度,数组扩容时,按你说的情况会走到图中圈起来的部分
,新数组的扩容阈值会等于当前数组长度*2*负载因子
imiMi_
2019-11-18
打赏
举报
回复
看这个图有些细节是看不懂的,建议看源码,这部分的源码我给你贴这儿了,这是jdk1.8的扩容逻辑 int oldCap = (oldTab == null) ? 0 : oldTab.length; int oldThr = threshold; int newCap, newThr = 0; if (oldCap > 0) { if (oldCap >= MAXIMUM_CAPACITY) { threshold = Integer.MAX_VALUE; return oldTab; } else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY && oldCap >= DEFAULT_INITIAL_CAPACITY) newThr = oldThr << 1; // double threshold } else if (oldThr > 0) // initial capacity was placed in threshold newCap = oldThr; else { // zero initial threshold signifies using defaults newCap = DEFAULT_INITIAL_CAPACITY; newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY); } if (newThr == 0) { float ft = (float)newCap * loadFactor; newThr = (newCap < MAXIMUM_CAPACITY && ft < (float)MAXIMUM_CAPACITY ? (int)ft : Integer.MAX_VALUE); } threshold = newThr;
java的
hashMap
多线程并发情况下
扩容
产生的死锁问题解决.docx
这就有可能导致A线程和B线程同时对一个数组
扩容
,A线程
扩容
后替换掉老数组,这时B线程使用的数组实际上是A线程
扩容
后的数组,就会产生线程安全问题。 死锁原因 比如,当前集合数组长度为2,已经有两个元素被放在了下标为0的节点里形成了链表结构,此时,有两个线程都同时向集合添加新元素,所以每个线程在添加时都会对原集合数组进行
扩容
。 插入前的数组 : 1)线程一先执行,当它执行完上面代码“Entry
next = e.next;”以后,e指向A,next指向B,时间片用完,线程一挂起。此时, : 2)线程二后执行,并且完成了整个
扩容
操作,而且
扩容
后的新数组替换了原数组。此时, : 3)线程一继续执行,e指向A,next指向B。此时,原数组已经被线程二扩充了。
hashmap
.zip
hashmap
.zip
深入arraylist,linkedlist,
hashmap
,hashset源码(2012/3/18)
NULL 博文链接:https://lvwenwen.iteye.com/blog/1456986
java
hashmap
扩容
大小_阅读 JDK 8 源码:
HashMap
扩容
总结及图解
在 Java8 中,
HashMap
由数组+链表+红黑树组成的。
扩容
时,数组容量翻倍,数组中每一个桶中的多个节点(链结构或树结构)都需要 rehash 迁移到新的数组中去。本文通过阅读
HashMap
的 resize 方法了解其
扩容
原理,对桶节点的迁移算法进行单元测试,画图以方便
理解
。1.
扩容
的时机
HashMap
中 put 入第一个元素,初始化数组 table。
HashMap
中的元素数量大...
简述
HashMap
的
扩容
机制
resize这个方法是
HashMap
的
扩容
方法。
HashMap
在
扩容
时,都是翻两倍,比如16的容量扩大到32,。
HashMap
进行
扩容
的方法是比较巧妙的,
扩容
后,与原来的下标(n-1)&hash相对,其实只是多了1bit位。
扩容
后节点要么是在原来位置,听起来好像很懵,所以还是认真看下面的分析:下面给出例子,比如从容量为16
扩容
到32时,画图表示:进行
扩容
,扩大到原来的两倍:到这
一步
,下标,
扩容
后的数据10101和原来的00101相比,其实就是多了1bit,10101。
Java SE
62,626
社区成员
307,258
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章