在 Java 中,Map
是一种非常重要的集合接口,用于存储键值对(Key-Value Pair)。它提供了高效的键值查找和操作能力,广泛应用于各种场景中。本文将深入探讨 Map
接口的实现类、继承关系以及常用方法,帮助读者更好地理解和使用 Map
。
1. Map 接口概述
Map
是 Java 集合框架中的一员,位于 java.util
包中。它表示一组键值对的集合,其中每个键(Key)都是唯一的,而值(Value)可以重复。Map
接口的主要特点包括:
- 键唯一性:每个键只能映射到一个值。
- 无序性:
Map
中的键值对没有固定的顺序(某些实现类如LinkedHashMap
除外)。 - 高效查找:通过键可以快速查找对应的值。
2. Map 接口的继承关系
Map
接口的继承关系如下:
说明:
Map
是顶级接口,定义了键值对的基本操作。AbstractMap
是一个抽象类,提供了Map
接口的部分实现。HashMap
、TreeMap
、LinkedHashMap
和WeakHashMap
是AbstractMap
的具体实现类。SortedMap
是一个接口,扩展了Map
,要求键值对按照键的顺序排序,**TreeMap
**是其实现类。ConcurrentMap
是一个接口,扩展了Map
,提供了线程安全的操作,ConcurrentHashMap
是其实现类。
2.1 主要实现类
以下是 Map
接口的常见实现类及其特点:
实现类 | 数据结构 | 顺序性 | 线程安全 | 允许null键/值 |
---|---|---|---|---|
HashMap | 哈希表 | 无序 | 否 | 允许 |
LinkedHashMap | 哈希表+双向链表 | 插入/访问顺序 | 否 | 允许 |
TreeMap | 红黑树 | 自然/自定义排序 | 否 | 键不允许null |
Hashtable | 哈希表 | 无序 | 是 | 不允许 |
ConcurrentHashMap | 分段哈希表 | 无序 | 是 | 不允许 |
2.1.1 实现类使用场景
- HashMap:默认选择,快速查找,不关心顺序。
- LinkedHashMap:需要保留插入顺序或访问顺序(LRU缓存)。
- TreeMap:需要按键的自然顺序或自定义排序。
- ConcurrentHashMap:高并发环境下的线程安全需求。
- Hashtable:遗留代码兼容,不推荐新项目使用。
3. Map 接口的常用方法
Map
接口定义了许多常用的方法,以下是其中一些核心方法:
3.1 添加和更新键值对
-
V put(K key, V value)
:
将指定的键值对添加到Map
中。如果键已存在,则更新对应的值。Map<String, Integer> map = new HashMap<>(); map.put("apple", 10); map.put("banana", 20); map.put("apple", 30); // 更新 "apple" 的值为 30
-
void putAll(Map<? extends K, ? extends V> m)
:
将另一个Map
中的所有键值对添加到当前Map
中。Map<String, Integer> map1 = new HashMap<>(); map1.put("apple", 10); map1.put("banana", 20); Map<String, Integer> map2 = new HashMap<>(); map2.putAll(map1); // 将 map1 的所有键值对添加到 map2
3.2 获取值
-
V get(Object key)
:
根据键获取对应的值。如果键不存在,则返回null
。Integer value = map.get("apple"); // 返回 30
-
V getOrDefault(Object key, V defaultValue)
:
根据键获取对应的值。如果键不存在,则返回指定的默认值。Integer value = map.getOrDefault("orange", 0); // 返回 0
3.3 删除键值对
-
V remove(Object key)
:
根据键删除对应的键值对,并返回被删除的值。Integer value = map.remove("apple"); // 删除 "apple" 并返回 30
-
boolean remove(Object key, Object value)
:
仅当键和值都匹配时,才删除对应的键值对。boolean isRemoved = map.remove("banana", 20); // 删除成功,返回 true
3.4 判断键或值是否存在
-
boolean containsKey(Object key)
:
判断Map
中是否包含指定的键。boolean hasKey = map.containsKey("apple"); // 返回 false
-
boolean containsValue(Object value)
:
判断Map
中是否包含指定的值。boolean hasValue = map.containsValue(30); // 返回 false
3.5 获取键值对集合
-
Set<K> keySet()
:
返回Map
中所有键的集合。Set<String> keys = map.keySet(); // 返回 ["banana"]
-
Collection<V> values()
:
返回Map
中所有值的集合。Collection<Integer> values = map.values(); // 返回 [20]
-
Set<Map.Entry<K, V>> entrySet()
:
返回Map
中所有键值对的集合。Set<Map.Entry<String, Integer>> entries = map.entrySet(); for (Map.Entry<String, Integer> entry : entries) { System.out.println(entry.getKey() + ": " + entry.getValue()); }
3.6 其他方法
-
int size()
:
返回Map
中键值对的数量。int size = map.size(); // 返回 1
-
boolean isEmpty()
:
判断Map
是否为空。boolean isEmpty = map.isEmpty(); // 返回 false
-
void clear()
:
清空Map
中的所有键值对。map.clear(); // 清空 Map
4. 总结
Map
是 Java 集合框架中非常重要的接口,提供了高效的键值对存储和操作能力。通过 HashMap
、TreeMap
、LinkedHashMap
等实现类,开发者可以根据具体需求选择合适的 Map
实现。本文详细介绍了 Map
的继承关系、常用方法以及使用示例,希望能够帮助读者更好地理解和使用 Map
。