判断键是否存在用containsKey()(O(1)),判断值是否存在用containsValue()(O(n));不可仅凭get()返回null断定键不存在,因value本身可为null。

Java 中判断 HashMap 是否包含某个键或值,主要靠两个方法:containsKey() 和 containsValue()。它们用途不同、性能差异大,用错容易引发逻辑错误或性能问题。
判断是否包含某个键:用 containsKey()
这是最常用、也最推荐的方式。它只检查键(key)是否存在,不关心对应值(value)是什么。
- 方法签名:
boolean containsKey(Object key) - 返回 true 表示该键在 HashMap 中有映射关系(哪怕对应 value 是 null)
- 时间复杂度平均为 O(1),HashMap 内部通过 hash 定位,效率很高
- 注意:比较依据是键对象的 equals() 方法,所以自定义类作 key 时必须正确重写 equals() 和 hashCode()
- 支持 null 键:如果 map 允许 null 键(HashMap 允许),
containsKey(null)可正常调用并返回结果
判断是否包含某个值:用 containsValue()
这个方法用于检查某个 value 对象是否作为值存在于 map 中。
- 方法签名:
boolean containsValue(Object value) - 需要遍历全部 entry,时间复杂度为 O(n),数据量大时慎用
- 同样依赖 value 对象的 equals() 判断,null 值也能匹配
- 举例:
map.containsValue("hello")会返回 true,只要任意一个 value.equals("hello") 成立
为什么不能用 get() 判断键是否存在?
因为 HashMap 允许 value 为 null。以下两种情况都会让 get(key) 返回 null:
立即学习“Java免费学习笔记(深入)”;
- key 根本不存在
- key 存在,但显式存入了
put(key, null)
仅靠 get() == null 无法区分,容易出 bug。正确做法始终是先调用 containsKey() 确认存在性,再取值。
常见误用与替代建议
- 想“有则更新、无则插入”?优先用
putIfAbsent(key, value),线程安全且原子 - 需要同时判断键存在并获取值?避免两次查找(先 containsKey 再 get),可直接 get 并配合 null 检查 + 明确业务逻辑处理
- 频繁查 value?考虑反向 Map(value → key)或额外维护 Set,避免反复调用低效的 containsValue()


















