JDK8HashMap的扩容核心解读,尾插法

看懂了JDK7Hashmap的扩容头插法,及其可能产生的循环引用问题,今天看看JDK8的HashMap扩容实现。采取的是用四个结点,两条链表完成重新分配位置,比较简单有趣。解析如下: 

 //如果原来的table等于null,直接返回if (oldTab != null) {//遍历原来的table,bucketfor (int j = 0; j < oldCap; ++j) {HashMap.Node<K, V> e;//bucketif ((e = oldTab[j]) != null) {//如果当前桶位上有元素,不为nulloldTab[j] = null;//当前位置置空if (e.next == null)//如果只有一个元素e,e.next为null,直接安排e到新表新家newTab[e.hash & (newCap - 1)] = e;else if (e instanceof HashMap.TreeNode)//判断e是不是树形节点,也就是超过8个元素((HashMap.TreeNode<K, V>) e).split(this, newTab, j, oldCap);//else { // preserve orderHashMap.Node<K, V> loHead = null, loTail = null;//低位的头结点,尾结点HashMap.Node<K, V> hiHead = null, hiTail = null;//高危的头结点,尾结点HashMap.Node<K, V> next;//下个节点do {//在这个循环里,依次处理该桶上链表,分裂成高位链和低位链next = e.next;//后一个节点元素//如果元素的hash值,与 原来表的容量 等于0,实际上是把原来在一个桶位的元素分流//例如e.hash & 10000,值会有0和1两种,等于0的,还是相对于原表的索引位置//等于1,把他向高位调整if ((e.hash & oldCap) == 0) {if (loTail == null)//只有第一次进来的时候,loTail为nullloHead = e;//设置头结点位eelseloTail.next = e;//尾插loTail = e;//低位链指针下移} else {if (hiTail == null)hiHead = e;elsehiTail.next = e;hiTail = e;}} while ((e = next) != null);//while循环完之后,大概会形成两个链表【高位链hiHead--hiTail,低位链loHead--loTail】,最极端的情况是只有高位链或//只有低位链。拿着这两个链表,插入到对应桶位,入驻新家。//判断低位链中是否有元素if (loTail != null) {loTail.next = null;//干掉低位链尾部的next,因为e的下一个结点很可能被分到高位,所以我们要干掉这个叛徒newTab[j] = loHead;}//判断高位链中是否有元素if (hiTail != null) {hiTail.next = null;newTab[j + oldCap] = hiHead;}}}}}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576469.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

领导者的资质——学习笔记(1)

领导者的资质——学习笔记&#xff08;1&#xff09;《领导者的资质》是稻盛和夫先生著作的一本书&#xff0c;书中的道理值得深深思考和体会&#xff0c;结合自己工作、生活中的一些事情&#xff0c;会有不同的感觉。本学习笔记特此记录书中重点的内容&#xff0c;供以后反复阅…

[转帖]ISE与Modelsim联合观察中间信号

如何仿真IP核&#xff08;建立modelsim仿真库完整解析&#xff09; 来源&#xff1a;http://www.ednchina.com/ART_49023_19_0_AN_7116cf44.HTM IP核生成文件&#xff1a;&#xff08;Xilinx/Altera 同&#xff09; IP核生成器生成 ip 后有两个文件对我们比较有用&#xff0c;假…

计算时间复杂度

步骤&#xff1a; 1、找到执行次数最多的语句 2、语句执行语句的数量级 3、用O表示结果 计算时间复杂度的3个出发点&#xff0c;掌握这三个出发点&#xff0c;那么一向搞不懂的时间复杂度就可以迎刃而解啦。 然后&#xff1a; 1、用常数1取代运行时间中的所有加法常数 2、…

领导者的资质——学习笔记(2):领导者的人格

领导者的资质——学习笔记&#xff08;2&#xff09;&#xff1a;领导者的人格在领导者的资质中&#xff0c;人格最为重要。领导者保持自己高层次的人格&#xff0c;是解决当前企业治理危机最根本性的方略。我们要时时事事思考“作为人&#xff0c;何为正确”不断自问自答&…

sql server 2008学习12 事务和锁

事务 事务的点: 1.begin tran 是事务开始的地方,也是 事务回滚的起点.也就说他会忽略这个起点之后的最终没有提交的所有语句, 2.commit tran 事务的提交 是一个事务的终点 当发出 commit tran命令时,可以认为 该事务是 持久的. 撤销已完成事务的唯一方法 是 发出一个新的事务.…

领导者的资质——学习笔记(3):领导者的十项职责

领导者的资质——学习笔记&#xff08;3&#xff09;&#xff1a;领导者的十项职责领导者必须向员工说明工作的目的意义&#xff0c;设定具体目标&#xff0c;制定相应的计划&#xff0c;怀着强烈的愿望&#xff0c;付出不亚于任何人的努力&#xff0c;表现出坚强的意志&#x…

漫画:什么是时间复杂度?

时间复杂度的意义 究竟什么是时间复杂度呢&#xff1f;让我们来想象一个场景&#xff1a;某一天&#xff0c;小灰和大黄同时加入了一个公司...... 一天过后&#xff0c;小灰和大黄各自交付了代码&#xff0c;两端代码实现的功能都差不多。大黄的代码运行一次要花100毫秒&#x…

Eclipse如何连接SQL Server 2005数据库

做管理系统当然少不了经常与数据库打交道&#xff0c;在网上搜了很多数据库版本都不小&#xff0c;大的有好几个G的&#xff0c;小的也有几百兆的&#xff0c;我这可怜的内存&#xff0c;最终找了个精简版中的精简版的Sql server2005&#xff0c;只有80几兆&#xff0c;本来只想…

NLP 最新进展

参考文献&#xff1a; •http://www.dataguru.cn/article-14237-1.html •https://zhuanlan.zhihu.com/p/46652512 •https://github.com/google-research/bert •https://allennlp.org/elmo •https://arxiv.org/pdf/1802.05365 •https://arxiv.org/abs/1810.04805

一句话评论设计模式六大原则

注&#xff1a;转自http://blog.csdn.net/jesse621/article/details/7216331 原则&#xff0c;故名思议则是本质的意思。所谓擒贼先擒王&#xff0c;研究设计模式自然要先了解设计原则&#xff0c;所有的模式都是在这些原则的基础之上发展起来的&#xff0c;有的是侧重一 个&am…

Big GAN

参考文献&#xff1a; •https://github.com/kayamin/DR-GAN •https://www.jianshu.com/p/4ee8f9284b81 •http://cvlab.cse.msu.edu/pdfs/Tran_Yin_Liu_CVPR2017.pdf •https://arxiv.org/abs/1809.11096 •https://juejin.im/entry/5c05e76c51882539c60cf2d5 •https:…

时间复杂度空间复杂度怎么算?

什么是算法 算法的定义是这样的&#xff1a;解题方案的准确而完善的描述&#xff0c;是一系列解决问题的清晰指令。巴拉巴拉的&#xff0c;虽然是一小句但还是不想看&#xff08;题外话&#xff1a;有时候吧专业名词记下来面试的时候还是挺有用的&#xff09;&#xff0c;其实…

什么样的知识,值得我们终生学习

#什么样的知识&#xff0c;值得我们终生学习&#xff1f; 原文&#xff1a;https://dwz.cn/vylyXXJi 一、引言 可能你从初中就开始抱怨&#xff1a;我学相似三角形能干什么&#xff1f;阿伏伽德罗常数有什么用&#xff1f;我一不跳楼&#xff0c;二不高空抛物&#xff0c;学自由…

美团面试题:Hashmap的结构,1.7和1.8有哪些区别,深入的分析

&#xff08;一&#xff09; 真实面试题之&#xff1a;Hashmap的结构&#xff0c;1.7和1.8有哪些区别 不同点&#xff1a; &#xff08;1&#xff09;JDK1.7用的是头插法&#xff0c;而JDK1.8及之后使用的都是尾插法&#xff0c;那么他们为什么要这样做呢&#xff1f;因为JDK1…

作品展结束了,学习才真正的开始

我的作品展旅程分为两个大的部分。 一、班里的事务&#xff08;这是最重要&#xff0c;也最为艰巨的。&#xff09; 从4月15号自考结束后&#xff0c;开始真正进入作品展的筹划阶段。主要和唐欢负责作品的筛选工作&#xff0c;由于我工作经验有限&#xff0c;能力更是有限&…

数据结构第一章概论习题及答案

一、名词解释 1.数据表示 2.数据处理 3.数据 4.数据元素 5.逻辑关系 6.逻辑结构 7.结构 8.运算 9.基本运算 10.存储结构 11.顺序存储结构 12.链式存储结构 13.索引存储结构 14.散列存储结构 15.算法 16.运行终止的程序可执行部分 17.…

管理学习笔记(1)——高效团队的五大关键

高效团队的五大关键1. 安全感&#xff1a;敢于冒险&#xff0c;不会因此干到不安 2. 可靠性&#xff1a;指望他人可以准时完成高质量的工作 3. 结构与清晰度&#xff1a;目标、角色和执行计划都很清楚、明确 4. 工作意义&#xff1a;对各自来说做意义重大的工作 5. 工作影响…

算法导论-用于不相交集合的数据结构

21.2-4 对于图21-3中操作序列的运行时间&#xff0c;给出其紧确的渐近界。假定采用的是链表表示和加权合并启发式策略。 解&#xff1a;make-set&#xff0c;O(n)&#xff1b;加权合并启发&#xff0c;每次将较短链表链接到较长链表&#xff0c;即每次将长度为1的集合链接到另外…

大数据技术之 Kafka (第 3 章 Kafka 架构深入 ) Kafka 消费者

3.3.1 消费方式 consumer 采用 pull&#xff08;拉&#xff09;模式从 broker 中读取数据。 push&#xff08;推&#xff09;模式很难适应消费速率不同的消费者&#xff0c;因为消息发送速率是由 broker 决定的。 它的目标是尽可能以最快速度传递消息&#xff0c;但是这样很…

最活跃FPGA论坛推荐社区

http://forums.xilinx.com/ Xilinx User Community Forums(Xilinx用户交流社区)http://www.openhw.org/ 中国首个开放源码硬件社区http://xilinx.eetrend.com/ 电子创新网赛灵思中文社区http://bbs.elecfans.com/forum.php 电子发烧友社区&#xff08;电子技术论坛&#xff09;…