- 判断
HashMap是否包含某个key。 - 判断
HashMap是否包含某个value。 - 判断
HashMap是否为空(即不包含任何键值对)。 - 判断两个
HashMap是否相等(包含相同的键值对)。
下面我们逐一分析,并提供代码示例。

判断 HashMap 是否包含某个 Key
这是最常用和最高效的判断操作。HashMap 内部通过哈希表实现,查找 key 的时间复杂度平均为 O(1)。
方法
使用 HashMap 的 containsKey(Object key) 方法,如果此映射包含指定 key 的映射关系,则返回 true。
代码示例
import java.util.HashMap;
import java.util.Map;
public class HashMapContainsKeyExample {
public static void main(String[] args) {
// 1. 创建并初始化一个 HashMap
Map<String, Integer> scores = new HashMap<>();
scores.put("Alice", 95);
scores.put("Bob", 88);
scores.put("Charlie", 76);
// 2. 判断是否包含某个 key
String keyToCheck1 = "Alice";
if (scores.containsKey(keyToCheck1)) {
System.out.println("HashMap 包含 key: " + keyToCheck1);
// 可以安全地获取对应的 value
System.out.println("Alice 的分数是: " + scores.get(keyToCheck1));
} else {
System.out.println("HashMap 不包含 key: " + keyToCheck1);
}
System.out.println("--------------------");
// 3. 判断一个不存在的 key
String keyToCheck2 = "David";
if (scores.containsKey(keyToCheck2)) {
System.out.println("HashMap 包含 key: " + keyToCheck2);
} else {
System.out.println("HashMap 不包含 key: " + keyToCheck2);
}
}
}
输出:
HashMap 包含 key: Alice
Alice 的分数是: 95
--------------------
HashMap 不包含 key: David
判断 HashMap 是否包含某个 Value
这个操作不像 containsKey 那样高效。HashMap 需要遍历所有的 value 来进行比较,因此其时间复杂度为 O(n),n 是 HashMap 中键值对的数量。

方法
使用 HashMap 的 containsValue(Object value) 方法,如果此映射将一个或多个 key 映射到指定 value,则返回 true。
代码示例
import java.util.HashMap;
import java.util.Map;
public class HashMapContainsValueExample {
public static void main(String[] args) {
// 1. 创建并初始化一个 HashMap
Map<String, Integer> scores = new HashMap<>();
scores.put("Alice", 95);
scores.put("Bob", 88);
scores.put("Charlie", 95); // 注意,Alice 和 Charlie 的分数相同
// 2. 判断是否包含某个 value
int valueToCheck1 = 95;
if (scores.containsValue(valueToCheck1)) {
System.out.println("HashMap 包含 value: " + valueToCheck1);
} else {
System.out.println("HashMap 不包含 value: " + valueToCheck1);
}
System.out.println("--------------------");
// 3. 判断一个不存在的 value
int valueToCheck2 = 100;
if (scores.containsValue(valueToCheck2)) {
System.out.println("HashMap 包含 value: " + valueToCheck2);
} else {
System.out.println("HashMap 不包含 value: " + valueToCheck2);
}
}
}
输出:
HashMap 包含 value: 95
--------------------
HashMap 不包含 value: 100
判断 HashMap 是否为空
判断 HashMap 中是否没有任何键值对。
方法
使用 HashMap 的 isEmpty() 方法,如果此映射不包含键值对,则返回 true。

代码示例
import java.util.HashMap;
import java.util.Map;
public class HashMapIsEmptyExample {
public static void main(String[] args) {
// 1. 创建一个空的 HashMap
Map<String, String> emptyMap = new HashMap<>();
System.out.println("新创建的 emptyMap 是否为空? " + emptyMap.isEmpty()); // true
// 2. 向 emptyMap 中添加一个元素
emptyMap.put("key1", "value1");
System.out.println("添加元素后 emptyMap 是否为空? " + emptyMap.isEmpty()); // false
// 3. 清空 map
emptyMap.clear();
System.out.println("clear() 后 emptyMap 是否为空? " + emptyMap.isEmpty()); // true
}
}
输出:
新创建的 emptyMap 是否为空? true
添加元素后 emptyMap 是否为空? false
clear() 后 emptyMap 是否为空? true
判断两个 HashMap 是否相等
判断两个 HashMap 是否包含完全相同的键值对,键和值都必须相等,且顺序不重要(因为 HashMap 是无序的)。
方法
使用 Map 接口继承自 Object 的 equals(Object o) 方法。HashMap 类已经重写了这个方法,可以正确地进行内容比较。
代码示例
import java.util.HashMap;
import java.util.Map;
public class HashMapEqualsExample {
public static void main(String[] args) {
// 创建两个内容相同的 HashMap
Map<String, Integer> map1 = new HashMap<>();
map1.put("A", 1);
map1.put("B", 2);
Map<String, Integer> map2 = new HashMap<>();
map2.put("B", 2);
map2.put("A", 1); // 顺序不同,但内容相同
Map<String, Integer> map3 = new HashMap<>();
map3.put("A", 1);
map3.put("B", 3); // value 不同
// 1. 比较内容相同的 map1 和 map2
System.out.println("map1 和 map2 是否相等? " + map1.equals(map2)); // true
// 2. 比较内容不同的 map1 和 map3
System.out.println("map1 和 map3 是否相等? " + map1.equals(map3)); // false
// 3. 比较一个 map 和 null
System.out.println("map1 和 null 是否相等? " + map1.equals(null)); // false
// 4. 比较一个 map 和另一个类型的对象
System.out.println("map1 和一个字符串是否相等? " + map1.equals("hello")); // false
}
}
输出:
map1 和 map2 是否相等? true
map1 和 map3 是否相等? false
map1 和 null 是否相等? false
map1 和一个字符串是否相等? false
总结与最佳实践
| 判断场景 | 推荐方法 | 时间复杂度 | 备注 |
|---|---|---|---|
| 是否包含某个 Key | map.containsKey(key) |
O(1) | 高效,是首选方法。 |
| 是否包含某个 Value | map.containsValue(value) |
O(n) | 低效,需遍历所有值,避免在性能敏感的代码中频繁使用。 |
| 是否为空 | map.isEmpty() |
O(1) | 高效,用于检查 map 中是否有数据。 |
| 是否相等 | map1.equals(map2) |
O(n) | 需要比较所有键值对,时间与 map 的大小成正比。 |
核心要点:
-
优先使用
containsKey:当你需要检查某个键是否存在时,永远优先选择containsKey,而不是通过get(key) != null来判断,因为get方法本身就需要查找,而containsKey更清晰地表达了你的意图,并且可以正确处理value为null的情况。// 推荐 if (map.containsKey("key")) { ... } // 不推荐 (value 可以为 null,则此判断会出错) if (map.get("key") != null) { ... } -
理解性能差异:牢记
containsKey和containsValue在性能上的巨大差异,这有助于你写出更高效的代码。 -
equals的强大:HashMap的equals方法非常强大,可以帮你轻松地比较两个映射的内容是否完全一致,而无需手动编写循环。
