HashMap、LinkedHashMap、Hashtable、ConcurrentHashMap 的区别?
这四个均是 Java 中的 Map 实现类,核心差异在于 “线程安全、有序性、性能、功能特性”,具体对比如下:
| 对比维度 | HashMap | LinkedHashMap | Hashtable | ConcurrentHashMap |
|---|---|---|---|---|
| 线程安全 | 非线程安全 | 非线程安全 | 线程安全(全表锁) | 线程安全(Java 7:分段锁;Java 8:CAS+synchronized) |
| 有序性 | 无序(存储顺序≠插入顺序) | 有序(维护双向链表,存储顺序 = 插入顺序) | 无序 | 无序(Java 8 后支持.keySet () 有序遍历) |
| 空键 / 空值支持 | 支持 1 个 null 键,多个 null 值 | 支持 1 个 null 键,多个 null 值 | 不支持 null 键和 null 值 | 不支持 null 键和 null 值 |
| 数据结构 | Java 8:数组 + 链表 / 红黑树 | 数组 + 链表 / 红黑树 + 双向链表(维护顺序) | 数组 + 链表 | Java 8:数组 + 链表 / 红黑树 |
| 性能(单线程) | 最高(无锁,查询效率高) | 略低于 HashMap(维护双向链表开销) | 最低(全表锁,并发阻塞) | 低于 HashMap,高于 Hashtable |
| 性能(多线程) | 不支持(并发修改可能抛出 ConcurrentModificationException) | 不支持 | 支持但低效(锁粒度大) | 支持且高效(锁粒度小,支持高并发) |
| 核心用途 | 单线程场景,无需有序 | 单线程场景,需维护插入 / 访问顺序 | Legacy 代码(不推荐新使用) | 多线程高并发场景(如电商订单、缓存) |
# 关键特性详解
- HashMap:最常用的 Map,单线程下性能最优,适合无需有序、非并发场景;
- LinkedHashMap:继承自 HashMap,通过双向链表维护顺序,适合需 “插入顺序” 或 “访问顺序” 的场景(如 LRU 缓存);
- Hashtable:古老的线程安全 Map,采用全表锁(修改时锁定整个表),并发性能差,且不支持 null 键值,现在已被 ConcurrentHashMap 替代;
- ConcurrentHashMap:专为高并发设计,Java 8 用 CAS+synchronized 替代分段锁,锁粒度细化到节点,支持高并发读写,同时避免了 HashMap 的线程安全问题。
#
上次更新: 12/30/2025