1. Java Map 集合体系
Map(接口) —— 键值对存储,key 唯一,value 可重复
├── HashMap // 无序,允许一个 null 键,多个 null 值
│ └── LinkedHashMap // 按插入顺序遍历
├── TreeMap // 按键排序(自然顺序/自定义比较器)
├── Hashtable // 线程安全(老版本,性能低)
└── ConcurrentHashMap // 高并发线程安全 Map
2. Map 的特点
-
键值对存储:
key唯一,value可重复 -
无索引,通过
key访问 -
null 支持:
-
HashMap/LinkedHashMap:允许 1 个 null 键,多个 null 值 -
TreeMap:不允许 null 键 -
Hashtable/ConcurrentHashMap:不允许 null 键/值
-
-
线程安全:
-
单线程建议
HashMap/LinkedHashMap/TreeMap -
多线程建议
ConcurrentHashMap
-
3. Map 常用方法
| 方法 | 说明 |
|---|---|
V put(K key, V value) | 添加/替换键值对 |
V get(Object key) | 根据键取值 |
V remove(Object key) | 删除指定键的映射 |
boolean containsKey(Object key) | 是否包含指定键 |
boolean containsValue(Object value) | 是否包含指定值 |
int size() | 元素个数 |
boolean isEmpty() | 是否为空 |
void clear() | 清空 |
Set<K> keySet() | 获取所有键 |
Collection<V> values() | 获取所有值 |
Set<Map.Entry<K,V>> entrySet() | 获取所有键值对 |
4. Map 遍历方式
4.1 遍历键 → 取值
for (String key : map.keySet()) {
System.out.println(key + " = " + map.get(key));
}
4.2 遍历所有值
for (String value : map.values()) {
System.out.println(value);
}
4.3 遍历键值对(entrySet,效率高)
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
4.4 使用 Iterator
Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, Integer> entry = it.next();
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
4.5 Lambda 遍历(Java 8+)
map.forEach((k, v) -> System.out.println(k + " : " + v));
5. Map 常用实现类及底层原理
5.1 HashMap
-
存储结构:JDK 1.8 之后 → 数组 + 链表 + 红黑树(解决哈希冲突)
-
线程不安全,效率高
-
哈希冲突:
hashCode()冲突时用链表存储,链表长度超过 8 转换为红黑树 -
时间复杂度:增删改查平均 O(1)
5.2 LinkedHashMap
-
特点:在
HashMap基础上加 双向链表,保持插入顺序 -
适合:需要按顺序遍历的场景
5.3 TreeMap
-
特点:键有序(默认自然顺序 / 自定义
Comparator) -
底层:红黑树
-
时间复杂度:增删改查 O(log n)
5.4 Hashtable
-
线程安全(方法加
synchronized),但效率低 -
不允许
null键和值
5.5 ConcurrentHashMap
-
线程安全(分段锁 / CAS)
-
不允许
null键和值 -
高并发性能好
6. 综合案例
统计一句话中每个单词出现的次数
import java.util.*;
public class WordCount {
public static void main(String[] args) {
String text = "java map java hashMap map lambda";
Map<String, Integer> wordCount = new HashMap<>();
for (String word : text.split(" ")) {
wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);
}
// 遍历输出(lambda)
wordCount.forEach((k, v) -> System.out.println(k + " 出现 " + v + " 次"));
}
}
运行结果
java 出现 2 次
map 出现 2 次
hashMap 出现 1 次
lambda 出现 1 次
root((Java Map集合))
体系结构
HashMap:::hashmap
▪️特点
⚠️ 无序 | 🔑 允许null键 | ⚡ 线程不安全
▪️底层结构
JDK8前: 数组+链表:::list
JDK8+: 数组+链表+红黑树:::tree
LinkedHashMap:::linked
▪️ 特点: 双向链表维持顺序
🔄 插入顺序/访问顺序
TreeMap:::treemap
▪️ 特点: 红黑树结构
🔼 自然排序 | 🔽 比较器排序
Hashtable:::sync
⚠️ 线程安全(synchronized)
❌ 不允许null键
ConcurrentHashMap:::conc
▪️ JDK7: 分段锁🔒
▪️ JDK8: CAS⚙️ + synchronized
核心特点
▪️ 存储结构: key-value pairs
🔑 Key: 唯一 | 🎨 Value: 可重复
⚠️ Null支持: 依实现类而定
常用方法
▪️ 修改
✏️ put(K,V) | 🗑️ remove(K)
▪️ 查询
🔍 get(K) | 📌 containsKey(K)
▪️ 工具
📏 size() | 🧹 clear()
遍历方式
🔄 keySet()
🔄 values()
🔄 entrySet()
λ forEach()
应用案例
📚 单词频率统计
👥 用户ID映射对象
示意图:
┌───────────┐
│ Java Map │
└─────┬─────┘
┌────────┴───────┐
┌────▼────┐ ┌──────▼──────┐
│HashMap │ │Concurrent │
│ 🟠 │ │HashMap 🔵 │
└────┬────┘ └──────┬──────┘
│ ┌───────┐ │
└─▶│JDK8: │◀────┘
│数组+ │
│红黑树 🌳│
└───────┘

1432

被折叠的 条评论
为什么被折叠?



