HashMap为什么扩容重新计算位置后,还能找到以前数据的位置

19 篇文章 15 订阅
订阅专栏
15 篇文章 2 订阅
订阅专栏

关于HashMap的详解文章请移步:

链接: HashMap源码研究——源码一行一行的注释

进行扩容,会伴随着一次重新hash分配,并且会遍历hash表中所有的元素,是非常耗时的。在编写程序中,要尽量避免resize。

HashMap在进行扩容时,使用的rehash方式非常巧妙,因为每次扩容都是翻倍,与原来计算的 (n-1)&hash的结果相比,只是多了一个bit位,所以节点要么就在原来的位置,要么就被分配到"原位置+旧容量"这个位置。
怎么理解呢?例如我们从16扩展为32时,具体的变化如下所示:
在这里插入图片描述
因此元素在重新计算hash之后,因为n变为2倍,那么n-1的标记范围在高位多1bit(红色),因此新的index就会发生这样的变化:
在这里插入图片描述
说明:5是假设计算出来的原来的索引。这样就验证了上述所描述的:扩容之后所以节点要么就在原来的位置,要么就被分配到"原位置+旧容量"这个位置。

因此,我们在扩充HashMap的时候,不需要重新计算hash,只需要看看原来的hash值新增的那个bit是1还是0就可以了,是0的话索引没变,是1的话索引变成“原索引+oldCap(原位置+旧容量)”。可以看看下图为16扩充为32的resize示意图:
在这里插入图片描述
正是因为这样巧妙的rehash方式,既省去了重新计算hash值的时间,而且同时,由于新增的1bit是0还是1可以认为是随机的,在resize的过程中保证了rehash之后每个桶上的节点数一定小于等于原来桶上的节点数,保证了rehash之后不会出现更严重的hash冲突,均匀的把之前的冲突的节点分散到新的桶中了。

关于HashMap扩容机制
zhuzhianing的博客
04-05 4万+
HashMap的底层有数组 + 链表(红黑树)组成,数组的大小可以在构造方法时设置,默认大小为16,数组中每一个元素就是一个链表,jdk7之前链表中的元素采用头插法插入元素,jdk8之后采用尾插法插入元素,由于插入的元素越来越多,查找效率就低了,所以满足某种条件时,链表会转换成红黑树。随着元素的增加,HashMap的数组会频繁扩容,如果构造时不赋予加载因子默认值,那么负载因子默认值为0.75,数组扩容的情况如下: 1:当添加某个元素后,数组的总的添加元素数大于了 数组长度 * 0.75(默认,也可自己设
ArrayList集合与HashMap扩容原来.docx
06-24
ArrayList集合与HashMap扩容原来.docx
java HashMap扩容详解及实例代码
08-31
主要介绍了java HashMap扩容详解及实例代码的相关资料,需要的朋友可以参考下
面试题:HashMap扩容机制
热门推荐
qq_29860591的博客
01-19 1万+
扩容机制 1.什么时候才需要扩容 在首次调用put方法的时候,初始化数组table 当HashMap中的元素个数超过数组大小(数组长度)*loadFactor(负载因子)时,就会进行数组扩容,loadFactor的默认值(DEFAULT_LOAD_FACTOR)是0.75,这是一个折中的取值。也就是说,默认情况下,数组大小为16,那么当HashMap中的元素个数超过16×0.75...
[HashMap源码学习之路]---数组扩容后元素的前后
凌大大的博客
08-07 4974
HashMap数组扩容后元素的前后化  &esmp;前一段时间看了HashMap扩容方法,觉得写的太好了,对我很有帮助,现以我理解的来写一下。主要说两方面: 扩容后元素的位置 扩容后元素如何分布的 1、扩容后元素的位置   HashMap扩容方法为resize() 。代码如下: final Node<K,V>[] resize() { N...
HashMap扩容
m0_66941325的博客
07-13 591
HashMap在JDK1.8的时候使用数组+链表+红黑树---也叫哈希桶。静态内部类Node就是一个节点,多个Node节点构成链表,当链表长度大于8,数据总量超过64转为红黑树。关于参数的源码设置关于HashMap初始值为2^(4)=16hash桶最大容量为2^(30)转化因子为0.75当链表长度为8时,且数组最大数据量为64时会产生树化,由链表转为红黑树当链表长度小于6时,会从红黑树退回链表。
简述HashMap扩容机制
最新发布
Nicky's blog
07-16 4290
resize这个方法是HashMap扩容方法。HashMap扩容时,都是翻两倍,比如16的容量扩大到32,。HashMap进行扩容的方法是比较巧妙的,扩容后,与原来的下标(n-1)&hash相对,其实只是多了1bit位。扩容后节点要么是在原来位置,听起来好像很懵,所以还是认真看下面的分析:下面给出例子,比如从容量为16扩容到32时,画图表示:进行扩容,扩大到原来的两倍:到这一步,下标,扩容后的数据10101和原来的00101相比,其实就是多了1bit,10101。
HashMap扩容机制】
Java程序员廖志伟
11-28 7995
我是廖志伟,一名Java开发工程师、幕后大佬社区创始人、Java领域优质创作者、CSDN博客专家。拥有多年一线研发经验,研究过各种常见框架及中间件的底层源码,对于大型分布式、微服务、三高架构(高性能、高并发、高可用)有过实践架构经验。 博主:java_wxid 社区:幕后大佬 文章目录HashMap扩容机制 本文的大概内容: HashMap扩容机制 将(k1,v1)直接放入Node类型的数组中,这个数组初始化容量是16,默认的加载因子是0.75。 HashMap有两个参数影响其性能:初始容量和加载.
hashmap扩容机制
weixin_45660035的博客
07-09 885
hashmap扩容机制
hashmap 遍历_HashMap扩容全过程
weixin_39739661的博客
11-22 796
1.如果HashMap的大小超过了负载因子(load factor)定义的容量,怎么办?默认的负载因子大小为0.75,也就是说,当一个map填满了75%的bucket时候,和其它集合类(如ArrayList等)一样,将会创建原来HashMap大小的两倍的bucket数组,来重新调整map的大小,并将原来的对象放入新的bucket数组中。这个过程叫作rehashing,因为它调用hash方法找到新的...
HashMap 扩容机制
认知 行动 坚持
09-07 344
HashMap在1.7 和1.8 做了比较大的改 1.7之前使用的就是数组 + 链表,它数据节点是一个Entry 节点,它的一个内部类;1.7之前它的数据插入过程是使用了头插入,头插入法虽然效率比较高,但在resize拓容过程时,反复调用一个transfer的方法,把里面的一些Entry进行一个rehash,可能会造成链表的循环,就可能在下一次Get的时候出现一个死循环的情况;1.7没有加锁,也可能在多线程并发的情况下,数据不能保证它是一个安全的,就是我push的进去的值,取出来还是我push进去的一个
HashMap在put数据时是如何找到要存放的位置的?.docx
06-17
分析HashMap在put数据时是如何找到要存放的位置的,对决定位置的hashCode计算方法进行详细解释,分析为啥要用高低16位异或运算,以及数组长度是如何影响元素存放位置
JAVA hashmap 负载因子为什么是0.75,官方解释
12-26
java hashmap 扩容因子为什么是0.75,官方给出的解释
ArrayList及HashMap扩容规则讲解
08-26
今天小编就为大家分享一篇关于ArrayList及HashMap扩容规则讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
hashmap 扩容是元素还是数组_曹工说JDK源码(1)--ConcurrentHashMap扩容前大家同在一个哈希桶,为啥扩容后,你去新数组的高位,我只能去低位?...
weixin_39638048的博客
12-21 132
如何计算,一对key/value应该放在哪个哈希桶大家都知道,hashmap底层是数组+链表(不讨论红黑树的情况),其中,这个数组,我们一般叫做哈希桶,大家如果去看jdk的源码,会发现里面有一些量,叫做bin,这个bin,就是桶的意思,结合语境,就是哈希桶。这里举个例子,假设一个hashmap的数组长度为4(0000 0100),那么该hashmap就有4个哈希桶,分别为bucket[0]、bu...
总结:HashMap扩容机制
好看的皮囊千篇一律有趣的灵魂万里挑一
12-05 1856
>一般扩容发生的时机:当你打算继续往这个HashMap存入元素的时候,HashMap的size大于等于HashMap容量的阀值。 jdk1.7 HashMap扩容原理: 【原理】:创建一个容量的新数组,重新计算每个元素在数组中的位置并且进行迁移。 【缺点】: (1)扩容后每个元素需要重新计算hash。 (2) 链表中元素顺序 每次迁移后被倒置。 JDK1.8 HashMap扩容策略: 【想...
Java8 HashMap扩容时为什么不需要重新hash
zlp1992的专栏
02-18 7456
java8在实现HashMap时做了一系列的优化,其中一个重要的优化即在扩容的时候,原有数组里的数据迁移到新数组里不需要重新hash,而是采用一种巧妙的方法,代码如下: table = newTab; if (oldTab != null) { for (int j = 0; j < oldCap; ++j) { ...
HashMap与HashTable的小细节笔记
u013444148的博客
03-03 67
继承树 继承类型 HashMap HashTable 类 AbstractMap<K,V> Dictionary<K,V> 接口 Map<K,V>, Cloneable, Serializable Map<K,V>, Cloneable, Serializable 继承的接口是一样的,都是Map,Cloneable,Serializable 接口 继承的类不一样。 数据存储结构 HashMap HashTable .
HashMap扩容机制
yamaxifeng_132的专栏
01-09 594
首先要了解HashMap扩容过程,我们就得了解一些HashMap中的量: Node&lt;K,V&gt;:链表节点,包含了key、value、hash、next指针四个元素table:Node&lt;K,V&gt;类型的数组,里面的元素是链表,用于存放HashMap元素的实体size:记录了放入HashMap的元素个数loadFactor:负载因子threshold:扩容的阈值,决定了Ha...
JDK7hashmap扩容后为什么需要重新计算hash值
04-22
JDK7中的HashMap在进行扩容时,会重新计算所有元素的hash值,因为扩容后新的桶数组的大小会是原来的两倍,而每个元素的位置是根据它的hash值和数组大小计算出来的,如果不重新计算元素的hash值,那么可能会导致元素...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • HashMap源码研究——源码一行一行的注释 101224
  • Stream.reduce()用法详细解析 87894
  • 什么是北向接口和南向接口 83070
  • Lua安装及常用命令使用 82294
  • BigDecimal使用总结 81644

分类专栏

  • 项目管理 2篇
  • 从源码探究原理 19篇
  • 常用设计模式与设计原则 12篇
  • JVM学习 22篇
  • 小赵的算法学习指南 69篇
  • SQL--知识及原理 15篇
  • Spring核心原理 10篇
  • Java并发编程 16篇
  • Redis 8篇
  • 学习笔记 19篇
  • Kafka学习--入门到调优 11篇
  • Java学习--基础常用方法 13篇
  • 原理不会,面试都跪 15篇
  • SQL--经验专栏 14篇
  • Mybatis 6篇
  • 杂七杂八的奇怪随笔 11篇

最新评论

  • BigInteger方法大全

    晓钰别浪: 为什么我用gcd,negate等方法会报错?

  • 大话数据结构PDF

    小泽991: 黑白的

  • 这本书太好了!150页就能让你上手大模型应用开发

    xxxp_2654616130: 真的这么好啊,博主回答下

  • Stream.reduce()用法详细解析

    飞鹰猪头: eg、例子: //支付金额 BigDecimal paymentPrice = orderItemList.stream().map(OrderItem::getPaymentPrice) .reduce(BigDecimal.ZERO, BigDecimal::add); --------------------------讲解: 这段代码使用 Java 8 的 Stream API 对订单项列表进行处理。首先,通过`orderItemList.stream()`将订单项列表转换为流。然后,使用`map(OrderItem::getPaymentPrice)`对每个订单项应用`getPaymentPrice()`方法,将每个订单项的支付价格提取出来。接下来,使用`reduce(BigDecimal.ZERO, BigDecimal::add)`将所有的支付价格进行累加,初始值为`BigDecimal.ZERO`,并使用`BigDecimal::add`作为累加的操作。 总而言之,这段代码的作用是计算订单项列表中所有订单项的支付价格之和,并将结果存储在`paymentPrice`变量中。

  • HashMap为什么用链表加红黑树?目的是什么?原理是什么

    DBCce: 喔,我不晓得是以2为底表情包

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 项目管理商业文件--商业论证与效益管理计划
  • 这本书太好了!150页就能让你上手大模型应用开发
  • 项目管理基本要素--项目、项目集、项目组合
2024年4篇
2023年14篇
2022年170篇
2021年92篇
2019年1篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向着百万年薪努力的小赵

感谢大佬,大佬步步高升

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司武威关键词按天扣费哪家好阿里店铺运营报价飞来峡网站定制报价鹤壁seo推荐天门网站推广方案多少钱金昌百度竞价哪家好黔南网站制作设计哪家好白山关键词按天扣费横岗关键词排名兰州网站设计模板公司通化seo网站推广哪家好济南SEO按天扣费价格天门百度爱采购价格潍坊网络推广报价淮安SEO按天收费公司抚州企业网站制作哪家好百色百度seo报价韶关英文网站建设天门阿里店铺运营推荐黄石SEO按天收费价格四平关键词按天计费公司蚌埠seo报价湘潭关键词按天收费多少钱吴忠seo网站推广推荐随州企业网站设计温州建站报价安阳模板推广推荐郴州网站搭建哈密外贸网站制作价格辽阳模板制作价格歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化