put()最常用,键存在则覆盖并返回旧值,不存在则新增并返回null;replace()只更新不新增;改key需先put再remove;compute()/merge()适用于基于原值的计算场景。

直接用 put(key, value) 就行,这是最常用也最稳妥的方式。键存在就覆盖旧值并返回旧值,不存在就新增,返回 null。
用 put() 覆盖已有键的值
不需要提前检查键是否存在,调用即生效:
-
map.put("name", "Alice"):如果 "name" 已存在,原值被替换,方法返回旧值;不存在则插入,返回null - 适合大多数场景——简洁、高效、语义清晰
- 注意:它不区分“更新”和“插入”,只要键相同就会覆盖
用 replace() 确保只更新不新增
当你明确只想改已有键的值,不想意外插入新键时,用 replace() 更安全:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
map.replace("age", 30):仅当 "age" 存在时才替换,否则什么也不做,返回旧值或null -
map.replace("score", 85, 95):只有当前值是 85 时,才替换成 95(带条件的原子更新) - 避免因拼写错误等导致误加无效键
修改 key 本身不是“替换”,而是“删旧建新”
HashMap 不允许直接修改 key。想把键 "oldKey" 改成 "newKey",只能分两步:
立即学习“Java免费学习笔记(深入)”;
- 先用
map.put("newKey", map.get("oldKey"))把值复制过去 - 再用
map.remove("oldKey")删除旧项 - 如果 value 是对象引用,注意避免并发修改或哈希码变化导致查找失败
复杂逻辑可用 compute() 或 merge()
需要基于原值计算新值(比如自增、拼接字符串),推荐用函数式方法:
-
map.compute("count", (k, v) -> (v == null) ? 1 : v + 1):安全地实现计数器 -
map.merge("tag", "new", (old, newVal) -> old + "," + newVal):有则合并,无则设默认值 - 这些方法天然线程安全(单个操作原子),但多线程仍建议用
ConcurrentHashMap

















