Java HashMap的put操作(Java1.6)

https://www.cnblogs.com/skywang12345/p/3310835.html

// 存储数据的Entry数组,长度是2的幂。
// HashMap是采用拉链法实现的,每一个Entry本质上是一个单向链表
transient Entry[] table;

复制代码
 1 // 将“key-value”添加到HashMap中
 2 public V put(K key, V value) {
 3     // 若“key为null”,则将该键值对添加到table[0]中。
 4     if (key == null)
 5         return putForNullKey(value);
 6     // 若“key不为null”,则计算该key的哈希值,然后将其添加到该哈希值对应的链表中。
 7     int hash = hash(key.hashCode());
 8     int i = indexFor(hash, table.length);
 9     for (Entry<K,V> e = table[i]; e != null; e = e.next) {
10         Object k;
11         // 若“该key”对应的键值对已经存在,则用新的value取代旧的value。然后退出!
12         if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
13             V oldValue = e.value;
14             e.value = value;
15             e.recordAccess(this);
16             return oldValue;
17         }
18     }
19 
20     // 若“该key”对应的键值对不存在,则将“key-value”添加到table中
21     modCount++;
22     addEntry(hash, key, value, i);
23     return null;
24 }
复制代码



从原码看,1.8使用了红黑树和链表两种结构,1.6只有链表.
resize的阈值都是 capacity * load factor
posted @   multitude  阅读(580)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示