循序渐进分析源码之 HashMap put 方法的示例分析
发表于:2024-10-22 作者:千家信息网编辑
千家信息网最后更新 2024年10月22日,循序渐进分析源码之 HashMap put 方法的执行流程(jdk 1.8 )的示例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望
千家信息网最后更新 2024年10月22日循序渐进分析源码之 HashMap put 方法的示例分析
循序渐进分析源码之 HashMap put 方法的执行流程(jdk 1.8 )的示例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
预备知识
注意:这里不会讲红黑树是什么,以及如何具体实现。我们只需知道它长什么样子并了解它的好处即可。
为什么 在jdk1.8 中采用数组+链表/红黑树的数据结构存储数据?
当 Hash 冲突严重时,在数组上的链表会越来越长,此时就会会降低查询时的效率;时间复杂度为 O(N)。 引入红黑树之后查询效率直接提高到了 O(logn)。
引入红黑树后,HashMap 内部数据结构长什么样子?
什么时候会采用链表,什么时候用红黑树?
当链表的大小大于预设的阈值(8)时就要转换为红黑树
put 方法源码(带注释)
final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node[] tab; // 局部变量,指向容器 Node p; // 局部变量 int n, i; // 1. 如果 HashMap 没有初始化,需要进行初始化 if ((tab = table) == null || (n = tab.length) == 0) n = (tab = resize()).length; // 2. 根据计算出的元素所在数组中的位置,并判断目标位置是否为空 // 2.1 如果为空. new 一个新的 Node 放置在目标位置 if ((p = tab[i = (n - 1) & hash]) == null) tab[i] = newNode(hash, key, value, null); // 2.2 如果不为空, 再分情况讨论 else { Node e; K k; // 2.2.1 如果目标位置有值(有可能是红黑树的根节点,也有可能是链表的表头),就比较key 是否相同(相当于提前判断吧) if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))) e = p; // 2.2.2 如果目标位置放的是一个红黑树,就按照红黑树的方式,写入数据 else if (p instanceof TreeNode) e = ((TreeNode )p).putTreeVal(this, tab, hash, key, value); // 2.2.3 如果目标位置放置的是一个链表,就遍历整个链表。 else { for (int binCount = 0; ; ++binCount) { // 如果当前节点的下一个节点为空,就 new 一个新的节点,然后当前节点指向这个新节点 if ((e = p.next) == null) { p.next = newNode(hash, key, value, null); // 对这个增加了一个节点的链表进行长度判断,如果长度大于阀值,就将链表转成红黑树 if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st treeifyBin(tab, hash); break; } // 如果当前节点的下一个节点不为空,就要判断 key 是否相同,如果相同,就跳出循环。 if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) break; p = e; } } // 对 2.2.1 和 2.2.2 和 2.2.3 进行判断。判断成立表示要覆盖原有位置的元素。 if (e != null) { V oldValue = e.value; if (!onlyIfAbsent || oldValue == null) e.value = value; afterNodeAccess(e); return oldValue; } } // 下面是扩容代码,暂时忽略 ++modCount; if (++size > threshold) resize(); afterNodeInsertion(evict); return null;}
put 方法的流程图
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。
节点
位置
目标
数据
方法
相同
数组
源码
分析
元素
变量
局部
指向
效率
数据结构
时候
样子
流程
知识
结构
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网公司算是高科技公司吗
概念结构设计是数据库设计的关键
金山区特定软件开发装饰
基于系统论的网络安全分析
中国台湾手机软件开发销售电话
江苏办公系统软件开发要多少钱
软件开发为什么要源码交付
服务器bios关掉警报
软件开发知识软件开发知识
帆软本地数据库sql
滨江区物流软件开发
网络安全冬奥标语
数据库建立的实验操作视频
博世集团软件开发怎么样
服务器2G上行带宽
公共网络安全管控系统
挖矿中转服务器搭建违法
进入服务器桌面
全新网络安全
嵌入式系统软件开发通常采用
杭州舒跑网络技术
海淀区软件开发售后保障
高斯数据库怎么查看数据库版本
芜湖电商软件开发定制公司
网络安全宣传武汉
以色列的网络安全吗
数据库怎么存储密码
行业专利分析数据库
前海互联网信息科技
西安冠盈互联网科技