HashMap扩容的这一步怎么理解

天涯with0 2019-11-17 11:36:11

这一步的扩容阈值不应该是数组长度*加载因子吗?为什么非得当前数组长度<default_inital_capacity时扩容阈值才等于长度*加载因子呢
...全文
514 2 打赏 收藏 转发到动态 举报
写回复
用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;

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧