Skip to content

2026-08-29 · Map 存键值对:一个 key 对应一个 value,按 key 查 value 一步到位。

Java Map 集合

1. Map 是什么

Map(映射):存的是"键值对"(key-value),每个 key 唯一,一个 key 只能对应一个 value。

key   →   value
"zhangsan" → {id:1, name:"张三"}     用户ID → 用户对象
"token123" → 登录信息                令牌 → 登录用户
"setting1" → "dark"                 配置项 → 配置值

和 Collection 的区别(一句话):Collection 存"一个个的值",Map 存"一对对的 key-value"。

java
Map<String, Integer> map = new HashMap<>();
map.put("age", 18);         // 存入键值对
map.put("score", 90);
map.get("age");             // 18(按 key 取 value)
map.containsKey("age");     // true(有没有这个 key)
map.containsValue(90);      // true(有没有这个 value)
map.remove("score");        // 按 key 删
map.size();                 // 1(几对)
map.put("age", 19);         // key 已存在 → 覆盖旧值,size 不变

关键特性:key 不能重复——重复 put 同一个 key 就是"覆盖更新"。所以 Map 天生适合做缓存/映射表。

方法作用
put(key, value)存入;key 已存在则覆盖
get(key)按 key 取 value,没有返回 null
containsKey(key)有没有这个 key(常用)
keySet()所有 key 的集合
values()所有 value 的集合
entrySet()所有"键值对"的集合(遍历用)
remove(key)按 key 删除

2. HashMap(默认首选)

java
Map<String, String> map = new HashMap<>();
map.put("name", "张三");
map.put("city", "深圳");

// 取不到时的惯用写法:先判断再取,避免 null
if (map.containsKey("name")) {
    System.out.println(map.get("name"));
}

底层一句话:底层是哈希表(数组 + 链表),put 时用 key 的 hashCode() 定位桶,equals 判断是否覆盖。查 O(1)——不用遍历所有元素,算一次哈希直接定位,100 万条也这个速度。

三个特点

  1. 无序:不保证遍历顺序
  2. key 和 value 都允许 null
  3. 线程不安全:并发场景用 ConcurrentHashMap(线程安全版),普通 HashMap 会出事

底层"链表转红黑树""负载因子 0.75""扩容 2 倍"这些细节属于原理级,业务开发用不到,遇到深挖时再查。

3. Map 的三种遍历方式

方式一:keySet(简单)

java
for (String key : map.keySet()) {
    System.out.println(key + " = " + map.get(key));
}

方式二:entrySet(高效,推荐)

java
for (Map.Entry<String, Integer> entry : map.entrySet()) {
    System.out.println(entry.getKey() + " = " + entry.getValue());
}

一次拿到 key 和 value。

方式三:forEach + Lambda(最简洁)

java
map.forEach((key, value) -> System.out.println(key + " = " + value));

日常写 forEach 最爽;要效率用 entrySet。

4. LinkedHashMap:保插入顺序

java
Map<String, String> map = new LinkedHashMap<>();
map.put("c", "1");
map.put("a", "2");
map.put("b", "3");
// 遍历:c → a → b(按插入顺序,HashMap 则是随机的)

场景:缓存、需要保序的映射(比如按添加顺序展示的配置)。

5. TreeMap:按键自动排序(了解即可)

key 自动升序排列,还能做区间查询(排行榜、时间范围):

java
Map<String, String> map = new TreeMap<>();
map.put("b", "2");
map.put("a", "1");
map.put("c", "3");
System.out.println(map.keySet()); // [a, b, c]

业务里"要排序"大部分用 SQL ORDER BY 解决,TreeMap 用得少,知道有这功能即可。

6. 小结

  1. Map 存键值对,key 唯一,put 重复 key 就是覆盖
  2. HashMap 是默认首选:查 O(1),无序,可存 null
  3. 遍历推荐 entrySetforEach(Lambda)
  4. LinkedHashMap 保插入顺序;TreeMap 按键排序(少用)
  5. 并发场景用 ConcurrentHashMap,普通 HashMap 会出事