查键用containskey()(o(1)),查值用values().contains()(o(n));不可用get()替代存在性检查,遍历entryset()适用于需额外逻辑的场景。

判断 HashMap 中键或值是否存在,方法明确、用法不同:查键高效(O(1)),查值需遍历(O(n)),不能混用。
判断键是否存在:用 containsKey()
这是最常用、最高效的方式。HashMap 底层基于哈希表,对 key 的存在性检查时间复杂度为 O(1)。
- 调用 map.containsKey(key),返回 boolean
- 内部通过 key 的 hashCode() 定位桶位置,再用 equals() 比较确认
- 注意:若 key 为 null,HashMap 允许,且会正确处理(null 键只可能有一个)
- 示例:map.containsKey("user_id") → true 表示该键已映射,无论对应 value 是什么(包括 null)
判断值是否存在:用 containsValue() 或 values().contains()
由于 value 不唯一、无索引,所有实现都必须遍历,时间复杂度为 O(n)。两者本质相同,推荐用 values().contains(value)。
-
map.containsValue(value) 是 Map 接口方法,HashMap 实际委托给
values().contains(value) - 依赖 value 对象的 equals() 方法;若为自定义对象,务必重写 equals() 和 hashCode()
- null 值合法:如果 map 中有
put("k", null),则values().contains(null)返回 true - 不建议用
map.get(key) == null反推 value 是否存在——它查的是 key,且无法区分“key 不存在”和“key 存在但 value 为 null”
需要额外逻辑时:遍历 entrySet()
当不只是“是否存在”,还要获取对应 key、判断范围、处理 null 值或提前终止时,直接遍历更灵活。
- 用 for (Map.Entry
entry : map.entrySet()) - 可调用
entry.getKey()和entry.getValue(),边查边做业务判断 - 遇到匹配项可立即
break,避免全量扫描(尤其数据量大且命中靠前时) - 示例:查找是否有 value 大于 100 的条目 → 遍历中比较
entry.getValue() > 100
小提醒:别用 get() 替代存在性检查
以下写法是典型误区:
- if (map.get("x") != null) → 这只能说明 key "x" 存在且 value 非 null,**不能说明某个 value 值存在**
- if (map.get(someKey) == targetValue) → 类型不匹配、null 安全问题多,语义错乱
- 存在性检查和取值是两个独立需求,应使用对应专用方法
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











