Map 是 Java 集合框架中键值对(Key-Value) 形式存储数据的核心接口,它像一本字典:Key 是唯一的 “单词”,Value 是对应的 “释义”,通过 Key 可以快速查找对应的 Value,是开发中最常用的集合之一。

一、Map 核心特性

  1. Key 唯一性:同一个 Map 中不能有重复的 Key(判断依据是 equals() 方法,同时推荐重写 hashCode()),重复添加相同 Key 会覆盖原有 Value。
  2. Value 可重复:不同 Key 可以对应相同的 Value。
  3. 无序 / 有序可选:默认实现(如 HashMap)是无序的,LinkedHashMap 保持插入顺序,TreeMap 按 Key 排序。
  4. 允许 null:HashMap/LinkedHashMap 允许 Key 和 Value 为 null(但 Key 只能有一个 null),Hashtable、TreeMap 不允许 Key 为 null。

二、常用实现类(开发高频)

表格

实现类 底层结构 有序性 线程安全 核心特点 适用场景
HashMap 数组 + 链表 + 红黑树 无序 非线程安全 查询 / 插入效率高(O (1)) 绝大多数单线程场景
LinkedHashMap 哈希表 + 双向链表 插入顺序 非线程安全 保留插入顺序,性能略低于 HashMap 需要按插入顺序遍历的场景
TreeMap 红黑树 按 Key 排序 非线程安全 可自定义排序规则 需要对 Key 排序的场景(如排序字典)
Hashtable 哈希表 无序 线程安全 性能差,已被淘汰 老旧代码兼容(推荐用 ConcurrentHashMap)
ConcurrentHashMap 分段锁 / CAS 无序 线程安全 高并发下性能优于 Hashtable 多线程高并发场景

三、核心操作代码示例

以下是 HashMap(最常用)的核心用法,其他实现类用法基本一致,仅特性不同:

java

运行

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MapDemo {
    public static void main(String[] args) {
        // 1. 创建 Map 对象(Key:String,Value:Integer)
        Map<String, Integer> scoreMap = new HashMap<>();

        // 2. 添加元素(put):Key重复会覆盖Value
        scoreMap.put("张三", 90);
        scoreMap.put("李四", 85);
        scoreMap.put("王五", 95);
        scoreMap.put("张三", 92); // 覆盖张三的分数为92

        // 3. 获取元素(get):通过Key查Value,Key不存在返回null
        int zhangSanScore = scoreMap.get("张三");
        System.out.println("张三的分数:" + zhangSanScore); // 输出:92

        // 4. 判断Key/Value是否存在
        boolean hasLiSi = scoreMap.containsKey("李四"); // true
        boolean has85 = scoreMap.containsValue(85); // true

        // 5. 遍历Map(三种常用方式)
        // 方式1:遍历所有Key,通过Key找Value(最常用)
        Set<String> keySet = scoreMap.keySet();
        for (String name : keySet) {
            System.out.println(name + ":" + scoreMap.get(name));
        }

        // 方式2:遍历Entry对象(一次性获取Key+Value,效率更高)
        Set<Map.Entry<String, Integer>> entrySet = scoreMap.entrySet();
        for (Map.Entry<String, Integer> entry : entrySet) {
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }

        // 方式3:Lambda表达式遍历(Java 8+)
        scoreMap.forEach((name, score) -> System.out.println(name + ":" + score));

        // 6. 删除元素(remove):通过Key删除
        scoreMap.remove("王五");

        // 7. 获取元素个数、清空Map
        int size = scoreMap.size(); // 2(张三、李四)
        scoreMap.clear(); // 清空所有元素
    }
}

四、关键注意事项

  1. Key 的选择:建议使用不可变类型(如 String、Integer)作为 Key,避免因 Key 内容修改导致 hash 值变化,无法找到对应的 Value。
  2. 空值处理:使用 get() 时,若 Key 不存在会返回 null,建议先通过 containsKey() 判断,或使用 Java 8+ 的 getOrDefault() 避免空指针:

    java

    运行

    // 若Key不存在,返回默认值0
    int zhaoLiuScore = scoreMap.getOrDefault("赵六", 0);
    
  3. 线程安全:单线程用 HashMap,多线程高并发用 ConcurrentHashMap,不要用 Hashtable(性能差)。

总结

  1. 核心本质:Map 是键值对集合,Key 唯一、Value 可重复,核心是通过 Key 快速查找 Value。
  2. 选型原则:单线程无序选 HashMap,需插入顺序选 LinkedHashMap,需排序选 TreeMap,多线程选 ConcurrentHashMap。
  3. 核心操作:put(添加 / 覆盖)、get(查询)、containsKey(判断 Key)、entrySet(高效遍历)是最常用的方法。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐