HashMap 添加键值对核心是put(K key, V value):key不存在则新增并返回null,存在则更新value并返回旧值;null键仅允许一个,自定义key须重写hashCode()和equals()且逻辑一致。

Java 中用 HashMap 管理键值对,核心是理解“存得准、取得对、判得清、遍历稳”四个要点。它不是简单地放进去再拿出来,而是依赖哈希计算、桶定位和键比较这一整套机制。
怎么正确添加和更新键值对
调用 put(K key, V value) 即可:
- 如果 key 之前不存在,就新增一条键值对,返回 null;
- 如果 key 已存在,就只更新 value,返回被覆盖的旧值;
- key 可以为 null(仅允许一个),value 可为 null(任意多个);
- 自定义类作 key 时,必须重写 hashCode() 和 equals(),且逻辑一致——否则 put 后 get 不到。
怎么安全获取和判断键是否存在
别靠 get(key) == null 判断键是否存在,因为 value 本身可能就是 null:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 查值用 get(key),返回对应 value 或 null(可能是没这个 key,也可能是 value 就是 null);
- 查键是否存在,必须用 containsKey(key);
- 查值是否存在,用 containsValue(value)(注意:该操作是 O(n),不推荐在大数据量下频繁调用)。
怎么高效遍历和操作所有键值对
不同场景选不同方式,避免性能陷阱:
立即学习“Java免费学习笔记(深入)”;
- 要同时访问 key 和 value → 用 entrySet() 配合增强 for 循环,效率最高;
- 只关心 key → 用 keySet();
- 只关心 value → 用 values();
- 需要边遍历边删除 → 必须用 Iterator 或 Java 8+ 的 removeIf(),直接用 for-each 删除会抛异常。
怎么避开常见坑
实际开发中容易忽略但影响稳定性的细节:
- 初始容量设太小会频繁扩容(rehash 开销大),预估数据量后建议构造时指定容量,比如 new HashMap(1024);
- null 键固定存在 table[0],但修改过 key 对象中影响 hashCode 的字段后,get() 就再也找不到它了;
- 链表转红黑树需同时满足两个条件:桶内节点数 ≥ 8 且 数组长度 ≥ 64;
- HashMap 非线程安全,多线程写入必须加锁或改用 ConcurrentHashMap。

















