Java中Map.remove(Object key, Object value)实现条件删除:仅当key存在且其value与参数value相等(equals判断)时才移除并返回true,否则返回false;支持null值匹配,依赖equals合理实现,并发Map中线程安全,语义区别于单参数remove。

Java 中 Map.remove(Object key, Object value) 方法实现的是“条件删除”:只有当指定 key 存在且其关联的 value 与传入的 value 相等(使用 equals() 判断)时,才移除该键值对;否则不执行任何操作,返回 false。
语义核心:原子性校验 + 删除
该方法不是先 get 再 remove,而是一次性完成“查+删”的原子判断:
- 若 key 不存在 → 直接返回
false - 若 key 存在但当前 value 不等于传入的 value(
currentValue.equals(value) == false)→ 不删除,返回false - 若 key 存在且
currentValue.equals(value) == true→ 删除该映射,返回true
典型用途:避免误删与并发安全
这个设计主要解决两类问题:
-
防止覆盖式误删:比如多个线程或多次调用中,key 对应的 value 可能已被更新,仅凭 key 删除会丢失数据一致性。用
remove(key, oldValue)可确保只删“当时预期的旧值” -
替代手动检查:比先
get()再if (equals()) remove()更简洁、线程更安全(尤其在非并发 Map 中避免竞态窗口)
注意事项与陷阱
使用时需注意以下细节:
立即学习“Java免费学习笔记(深入)”;
-
null 值支持:value 参数可为
null,此时会匹配当前 value 也为null的条目(即currentValue == null && value == null) -
equals 实现必须合理:依赖 value 类型的
equals()方法。若自定义类未重写equals(),将使用Object.equals()(即引用比较),导致条件总失败 - ConcurrentHashMap 等并发 Map 中,该方法是线程安全的;但普通 HashMap 不保证多线程下整体逻辑原子性(仅本方法调用过程无并发修改异常)
对比 remove(key) 单参数版本
单参数 remove(key) 是无条件删除(只要 key 存在就删,不管 value 是什么),并返回被删的 value(可能为 null);而双参数版本强调“值匹配才删”,返回的是是否成功删除的布尔结果,语义完全不同。


















