理解 Map 接口的核心概念:键值对映射与键的唯一性
掌握主流 Map 实现类(HashMap、LinkedHashMap、TreeMap、Hashtable)的特性与适用场景
熟练进行 Map 的增、删、改、查及遍历操作
能够在多线程环境中安全使用 Map
Map 是 Java 集合框架中的核心接口之一,位于 java.util 包中。它表示一组键(Key),其中:
键必须唯一(不能重复)
值可以重复
提供基于键的高效查找、插入和删除操作
注意:
Map不是Collection的子接口,因此不继承Collection的方法。
泛型声明
public interface Map<K, V>K:键的类型
V:值的类型

最佳实践:
单线程 →
HashMap需要顺序 →
LinkedHashMap需要排序 →
TreeMap多线程 →
ConcurrentHashMap
由于 Map 是接口,必须通过实现类实例化:
// 推荐写法(Java 7+ 钻石操作符)
Map<String, Integer> map = new HashMap<>();
// 其他实现
Map<String, String> linkedMap = new LinkedHashMap<>();
Map<Integer, String> treeMap = new TreeMap<>();使用 put(K key, V value) 方法:
Map<String, Integer> m = new HashMap<>();
m.put("Alice", 25);
m.put("Bob", 30);
m.put("Alice", 26); // 更新已有键
System.out.println(m); // {Alice=26, Bob=30}(顺序不定)注意:重复的键会覆盖旧值。
安全添加(仅当键不存在时)
m.putIfAbsent("Charlie", 35); // 仅当 "Charlie" 不存在时才添加直接使用 put() 即可更新:
m.put("Bob", 31);
System.out.println(m); // {Alice=26, Bob=31}m.remove("Alice"); // 删除键为 "Alice" 的条目
System.out.println(m); // {Bob=31}entrySet()(推荐)for (Map.Entry<String, Integer> entry : m.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}keySet()for (String key : m.keySet()) {
System.out.println(key + " : " + m.get(key));
}values()for (Integer value : m.values()) {
System.out.println(value);
}性能建议:优先使用
entrySet(),避免多次调用get()。
getOrDefault避免空指针
Map<String, Integer> scores = new HashMap<>();
int aliceScore = scores.getOrDefault("Alice", 0); // 若无 "Alice",返回 0merge合并值
// 统计词频
Map<String, Integer> wordCount = new HashMap<>();
wordCount.merge("Java", 1, Integer::sum); // 若存在则累加,否则设为 1ConcurrentHashMapConcurrentHashMap<String, Integer> concurrentMap = new ConcurrentHashMap<>();
concurrentMap.put("key", 1);
Integer value = concurrentMap.get("key");高并发性能优异
支持原子操作(如 computeIfAbsent)
Map 存储键值对,键唯一,值可重复
HashMap 是默认选择;LinkedHashMap 保持顺序;TreeMap 自动排序
遍历时优先使用 entrySet() 提升性能
多线程环境下应使用 ConcurrentHashMap,而非 Hashtable 或 synchronizedMap
利用 getOrDefault、putIfAbsent、merge 等现代方法编写更安全、简洁的代码
为什么 TreeMap 在使用自然排序时不允许 null 键?这与其底层红黑树结构有什么关系?
在实现一个缓存系统时,如果希望最近访问的元素排在最后(LRU 缓存),应选择哪种 Map?如何配置?
HashMap 在 Java 8 中引入了“链表转红黑树”的优化,这一机制在什么条件下触发?有何好处?