containskey()用于判断map中是否包含指定键,时间复杂度o(1),依赖key的equals和hashcode;containsvalue()用于判断是否包含指定值,时间复杂度o(n),需遍历全部entry。

直接用 containsKey() 和 containsValue() 方法就行,这两个是 Map 接口定义的标准方法,所有实现类(包括 HashMap)都支持。
判断 Key 是否存在:用 containsKey()
这是最常用、效率最高的方式。底层基于哈希计算,平均时间复杂度为 O(1)。
- 传入要查找的 key 对象,返回 true 表示存在,false 表示不存在
- key 为
null也合法,HashMap允许一个null键 - 比较逻辑依赖于 key 自身的
equals()和hashCode()实现
示例:
map.put("name", 25);
map.put("score", 96);
System.out.println(map.containsKey("name")); // true
System.out.println(map.containsKey("age")); // false
判断 Value 是否存在:用 containsValue()
这个方法也能用,但要注意性能——它必须遍历全部 Entry,时间复杂度是 O(n)。
- 传入要查找的 value 对象,返回 true 表示至少有一个键对应这个值
- value 为
null同样支持 - 比较同样依赖 value 的
equals()方法
示例:
System.out.println(map.containsValue(25)); // trueSystem.out.println(map.containsValue(100)); // false
常见误区和注意事项
-
containsKey("abc")查的是 key,不是字符串内容是否“包含”在某个 key 里——它不支持子串匹配或模糊查找 - 不要用
get(key) != null来代替containsKey(),因为 value 本身可能是null,会导致误判 - 如果频繁按 value 查找,说明数据结构可能不合理;考虑反向建一个
HashMap<value key></value>,或改用其他策略 - 多线程环境下,
HashMap本身不安全,需用ConcurrentHashMap或加锁保障一致性
进阶替代方案
当需要更灵活的判断逻辑时,可结合其他方法:
- 查 key 存在且不为 null 的 value:
map.getOrDefault(key, null) != null(注意仍需确保 value 不为 null) - 查 key 存在后取值,避免重复查找:
if (map.containsKey(k)) { v = map.get(k); }可简化为v = map.get(k); if (v != null || map.containsKey(k)) { ... },但推荐直接用get()+ 判空,或用getOrDefault() - Java 8+ 可用
map.keySet().stream().anyMatch(k -> k.startsWith("pre"))做前缀匹配,但属于遍历操作,非 O(1)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











