【Java基础-44.7】Java 中的 Map 集合接口:实现类、继承关系及常用方法详解

在 Java 中,Map 是一种非常重要的集合接口,用于存储键值对(Key-Value Pair)。它提供了高效的键值查找和操作能力,广泛应用于各种场景中。本文将深入探讨 Map 接口的实现类、继承关系以及常用方法,帮助读者更好地理解和使用 Map


1. Map 接口概述

Map 是 Java 集合框架中的一员,位于 java.util 包中。它表示一组键值对的集合,其中每个键(Key)都是唯一的,而值(Value)可以重复。Map 接口的主要特点包括:

  • 键唯一性:每个键只能映射到一个值。
  • 无序性Map 中的键值对没有固定的顺序(某些实现类如 LinkedHashMap 除外)。
  • 高效查找:通过键可以快速查找对应的值。

2. Map 接口的继承关系

Map 接口的继承关系如下:

«interface»
Map
+put(K key, V value)
+get(Object key)
+remove(Object key)
+keySet()
+values()
+entrySet()
«abstract»
AbstractMap
HashMap
TreeMap
LinkedHashMap
WeakHashMap
«interface»
SortedMap
«interface»
ConcurrentMap
ConcurrentHashMap

说明:

  1. Map 是顶级接口,定义了键值对的基本操作。
  2. AbstractMap 是一个抽象类,提供了 Map 接口的部分实现。
  3. HashMapTreeMapLinkedHashMapWeakHashMapAbstractMap 的具体实现类。
  4. SortedMap 是一个接口,扩展了 Map,要求键值对按照键的顺序排序,**TreeMap **是其实现类。
  5. 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 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 keySet()
    返回 Map 中所有键的集合。

    Set<String> keys = map.keySet(); // 返回 ["banana"]
    
  • Collection values()
    返回 Map 中所有值的集合。

    Collection<Integer> values = map.values(); // 返回 [20]
    
  • Set> 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 集合框架中非常重要的接口,提供了高效的键值对存储和操作能力。通过 HashMapTreeMapLinkedHashMap 等实现类,开发者可以根据具体需求选择合适的 Map 实现。本文详细介绍了 Map 的继承关系、常用方法以及使用示例,希望能够帮助读者更好地理解和使用 Map

你可能感兴趣的:(#,Java基础,java,开发语言)