业精于勤,荒于嬉
种一棵树
|

超级鲨鱼辣椒

园龄:6年4个月粉丝:5关注:1

2021-08-09 14:51阅读: 304评论: 0推荐: 0

HashMap番外(一):链表新增是头部插入还是尾部插入呢?

本文基于 JDK1.8


话不多说,看看源码怎么肥四呢

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
boolean evict) {
... ...
if (p.hash == hash &&
((k = p.key) == key || (key != null && key.equals(k))))
e = p;
else if (p instanceof TreeNode)
e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
else {
// 着重看这个 for 循环
for (int binCount = 0; ; ++binCount) {
if ((e = p.next) == null) {
p.next = newNode(hash, key, value, null);
if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
treeifyBin(tab, hash);
break;
}
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
break;
p = e;
}
}
if (e != null) { // existing mapping for key
V oldValue = e.value;
if (!onlyIfAbsent || oldValue == null)
e.value = value;
afterNodeAccess(e);
return oldValue;
}
}
... ...
}

上面的源码是 HashMapput 方法内部调用的 putVal 方法的代码,putVal 方法的详细解读参照我的另一篇文章浅谈 HashMap(二):put 插入方法源码分析。从上文源码可知,当已有链表存在时,依次遍历链表,在链表尾部插入新元素。

posted @   超级鲨鱼辣椒  阅读(304)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开