Java Map
·
Map 是 Java 集合框架中键值对(Key-Value) 形式存储数据的核心接口,它像一本字典:Key 是唯一的 “单词”,Value 是对应的 “释义”,通过 Key 可以快速查找对应的 Value,是开发中最常用的集合之一。
一、Map 核心特性
- Key 唯一性:同一个 Map 中不能有重复的 Key(判断依据是
equals()方法,同时推荐重写hashCode()),重复添加相同 Key 会覆盖原有 Value。 - Value 可重复:不同 Key 可以对应相同的 Value。
- 无序 / 有序可选:默认实现(如 HashMap)是无序的,LinkedHashMap 保持插入顺序,TreeMap 按 Key 排序。
- 允许 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(); // 清空所有元素
}
}
四、关键注意事项
- Key 的选择:建议使用不可变类型(如 String、Integer)作为 Key,避免因 Key 内容修改导致 hash 值变化,无法找到对应的 Value。
- 空值处理:使用
get()时,若 Key 不存在会返回 null,建议先通过containsKey()判断,或使用 Java 8+ 的getOrDefault()避免空指针:java
运行
// 若Key不存在,返回默认值0 int zhaoLiuScore = scoreMap.getOrDefault("赵六", 0); - 线程安全:单线程用 HashMap,多线程高并发用 ConcurrentHashMap,不要用 Hashtable(性能差)。
总结
- 核心本质:Map 是键值对集合,Key 唯一、Value 可重复,核心是通过 Key 快速查找 Value。
- 选型原则:单线程无序选 HashMap,需插入顺序选 LinkedHashMap,需排序选 TreeMap,多线程选 ConcurrentHashMap。
- 核心操作:put(添加 / 覆盖)、get(查询)、containsKey(判断 Key)、entrySet(高效遍历)是最常用的方法。
更多推荐

所有评论(0)