Appearance
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 万条也这个速度。
三个特点:
- 无序:不保证遍历顺序
- key 和 value 都允许 null
- 线程不安全:并发场景用
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. 小结
- Map 存键值对,key 唯一,
put重复 key 就是覆盖 HashMap是默认首选:查 O(1),无序,可存 null- 遍历推荐
entrySet或forEach(Lambda) LinkedHashMap保插入顺序;TreeMap按键排序(少用)- 并发场景用
ConcurrentHashMap,普通 HashMap 会出事