Java 常见 Map 对比总结:HashMap、LinkedHashMap、TreeMap、ConcurrentHashMap

张开发
2026/4/18 1:50:24 15 分钟阅读

分享文章

Java 常见 Map 对比总结:HashMap、LinkedHashMap、TreeMap、ConcurrentHashMap
文章目录怎么选1. HashMap2. LinkedHashMap3. Hashtable4. ConcurrentHashMap5. WeakHashMap6. IdentityHashMap7. EnumMap8. TreeMapLinkedHashMap三、LinkedHashMap 的“顺序”是什么四、为什么它能保持顺序九、回到你的代码为什么用它常见的 “HashMap” 一般可以分成两层来理解一层是Java 里常见的 Map 实现类另一层是广义上基于哈希思想的 Map/Set 容器。类是否有序线程安全是否允许 null说明HashMap否否允许最常用LinkedHashMap是否允许保持顺序Hashtable否是不允许老方案ConcurrentHashMap否是不允许并发首选WeakHashMap否否允许弱引用 keyIdentityHashMap否否允许用比较 keyEnumMap枚举顺序否key 不可为 null枚举专用TreeMap排序否key 通常不可为 null红黑树怎么选可以直接这样记只要快不关心顺序→HashMap要保持插入顺序→LinkedHashMap多线程并发→ConcurrentHashMap要按 key 排序→TreeMap1.HashMap最常用。特点底层是哈希表无序允许null key和null value线程不安全示例MapString,IntegermapnewHashMap();map.put(a,1);适用场景只关心快速存取不关心遍历顺序2.LinkedHashMap你刚问到的这个。特点基于HashMap有顺序默认保持插入顺序也可以按访问顺序线程不安全示例MapString,IntegermapnewLinkedHashMap();适用场景需要稳定输出顺序配置、缓存、文件读写回写3.Hashtable比较老的类。特点线程安全方法基本都synchronized不允许null key和null value性能通常不如现代方案现在一般不推荐新项目直接用示例MapString,IntegermapnewHashtable();适用场景主要是老代码兼容现代项目通常用ConcurrentHashMap替代4.ConcurrentHashMap并发环境最常见。特点线程安全性能比Hashtable更好不允许null key和null value适合多线程读写示例MapString,IntegermapnewConcurrentHashMap();适用场景多线程共享缓存并发统计服务端程序5.WeakHashMap特殊用途。特点key 是弱引用当 key 没有其他强引用时可能被 GC 回收常用于缓存示例MapObject,StringmapnewWeakHashMap();适用场景想让缓存条目在 key 不再使用时自动释放6.IdentityHashMap按“对象地址意义”比较不按equals()比较。特点比较 key 时用不是常规语义的 Map很容易误用示例MapString,IntegermapnewIdentityHashMap();比如StringanewString(x);StringbnewString(x);在普通HashMap里a和b认为是同一个 key。在IdentityHashMap里它们不是同一个 key。适用场景需要按对象身份区分而不是按内容区分7.EnumMap严格说它不是 HashMap但经常一起比较。特点key 必须是枚举类型性能高内存占用低顺序通常按枚举定义顺序示例enumStatus{NEW,RUNNING,DONE}MapStatus,StringmapnewEnumMap(Status.class);适用场景key 是枚举时优先考虑它而不是HashMap8.TreeMap也不是 HashMap但也是常见 Map。特点按 key 排序底层是红黑树查询/插入通常是O(log n)示例MapString,IntegermapnewTreeMap();适用场景需要排序后的 keyLinkedHashMapLinkedHashMap是 Java 集合框架中的一个 Map 实现类它的核心特点是既是 HashMap基于哈希表又能保持元素的顺序MapK,VmapnewLinkedHashMap();本质上继承自HashMap额外维护了一个双向链表三、LinkedHashMap 的“顺序”是什么默认是 插入顺序Insertion Order示例MapString,IntegermapnewLinkedHashMap();map.put(A,1);map.put(C,3);map.put(B,2);System.out.println(map);输出{A1, C3, B2} 顺序就是你put的顺序四、为什么它能保持顺序内部结构HashMap快速查找 双向链表维护顺序每个节点类似[prev] ← node → [next]所以查找O(1)遍历按顺序走链表九、回到你的代码为什么用它MapString,StringmapnewLinkedHashMap(); 目的很明确保证读取文件 → 顺序不乱写回文件 → 顺序一致否则如果用HashMap每次写出来顺序都可能不同 ❌

更多文章