HashMap.put()插入键值对,键存在则覆盖并返回旧值,否则返回null;需重写hashCode()和equals()保证正确性;非线程安全,并发下可能死循环或数据丢失。

Java 中 HashMap 通过 put(K key, V value) 方法插入键值对,核心是根据键的 hashCode() 计算桶位置,再处理哈希冲突(如链表或红黑树)。
基本用法:调用 put() 插入数据
直接传入键和值即可。如果键已存在,新值会覆盖旧值,并返回被替换的旧值;如果键不存在,返回 null。
HashMap<string integer> map = new HashMap();
map.put("apple", 10); // 返回 null
map.put("banana", 20); // 返回 null
map.put("apple", 15); // 键已存在,返回 10,value 更新为 15</string>底层关键逻辑:哈希计算与桶定位
每次 put 时:
- 调用键对象的
hashCode()得到哈希值 - 对哈希值做扰动运算(高位参与低位运算),减少碰撞
- 用
(n - 1) & hash(n 是数组长度,2 的幂)快速计算下标,替代取模 - 找到对应桶(数组索引),检查是否已有相同键(通过
equals()判断)
注意键对象的正确实现
自定义类作键时,必须重写 hashCode() 和 equals(),否则可能:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
- 同一逻辑键被存成多个不同项(
hashCode不一致 → 桶位置不同) -
get()找不到已put的键(equals不满足判断条件)
建议用 IDE 自动生成,或使用 Lombok 的 @EqualsAndHashCode。
线程不安全,多线程需谨慎
HashMap 不是线程安全的。并发 put 可能导致:
- 死循环(JDK 7 扩容时链表环)
- 数据丢失(两个线程同时发现桶为空,都写入,后者覆盖前者)
如需并发写入,可选 ConcurrentHashMap、外部加锁,或初始化时预估容量避免扩容。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










