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

文章目录

常见的 "HashMap" 一般可以分成两层来理解:

一层是 Java 里常见的 Map 实现类 ,另一层是 广义上基于哈希思想的 Map/Set 容器。

类 是否有序 线程安全 是否允许 null 说明
HashMap 否 否 允许 最常用
LinkedHashMap 是 否 允许 保持顺序
Hashtable 否 是 不允许 老方案
ConcurrentHashMap 否 是 不允许 并发首选
WeakHashMap 否 否 允许 弱引用 key
IdentityHashMap 否 否 允许 用 == 比较 key
EnumMap 枚举顺序 否 key 不可为 null 枚举专用
TreeMap 排序 否 key 通常不可为 null 红黑树

怎么选

可以直接这样记:

  • 只要快,不关心顺序 → HashMap
  • 要保持插入顺序 → LinkedHashMap
  • 多线程并发 → ConcurrentHashMap
  • 要按 key 排序 → TreeMap

1. HashMap

最常用。

特点:

  • 底层是哈希表
  • 无序
  • 允许 null key 和 null value
  • 线程不安全

示例:

java 复制代码
Map<String, Integer> map = new HashMap<>();
map.put("a", 1);

适用场景:

  • 只关心快速存取
  • 不关心遍历顺序

2. LinkedHashMap

你刚问到的这个。

特点:

  • 基于 HashMap
  • 有顺序
  • 默认保持插入顺序
  • 也可以按访问顺序
  • 线程不安全

示例:

java 复制代码
Map<String, Integer> map = new LinkedHashMap<>();

适用场景:

  • 需要稳定输出顺序
  • 配置、缓存、文件读写回写

3. Hashtable

比较老的类。

特点:

  • 线程安全(方法基本都 synchronized)
  • 不允许 null key 和 null value
  • 性能通常不如现代方案
  • 现在一般不推荐新项目直接用

示例:

java 复制代码
Map<String, Integer> map = new Hashtable<>();

适用场景:

  • 主要是老代码兼容
  • 现代项目通常用 ConcurrentHashMap 替代

4. ConcurrentHashMap

并发环境最常见。

特点:

  • 线程安全
  • 性能比 Hashtable 更好
  • 不允许 null key 和 null value
  • 适合多线程读写

示例:

java 复制代码
Map<String, Integer> map = new ConcurrentHashMap<>();

适用场景:

  • 多线程共享缓存
  • 并发统计
  • 服务端程序

5. WeakHashMap

特殊用途。

特点:

  • key 是弱引用
  • 当 key 没有其他强引用时,可能被 GC 回收
  • 常用于缓存

示例:

java 复制代码
Map<Object, String> map = new WeakHashMap<>();

适用场景:

  • 想让缓存条目在 key 不再使用时自动释放

6. IdentityHashMap

按"对象地址意义"比较,不按 equals() 比较。

特点:

  • 比较 key 时用 ==
  • 不是常规语义的 Map
  • 很容易误用

示例:

java 复制代码
Map<String, Integer> map = new IdentityHashMap<>();

比如:

java 复制代码
String a = new String("x");
String b = new String("x");

在普通 HashMap 里,a 和 b 认为是同一个 key。

在 IdentityHashMap 里,它们不是同一个 key。

适用场景:

  • 需要按对象身份区分,而不是按内容区分

7. EnumMap

严格说它不是 HashMap,但经常一起比较。

特点:

  • key 必须是枚举类型
  • 性能高,内存占用低
  • 顺序通常按枚举定义顺序

示例:

java 复制代码
enum Status { NEW, RUNNING, DONE }
Map<Status, String> map = new EnumMap<>(Status.class);

适用场景:

  • key 是枚举时,优先考虑它,而不是 HashMap

8. TreeMap

也不是 HashMap,但也是常见 Map。

特点:

  • 按 key 排序
  • 底层是红黑树
  • 查询/插入通常是 O(log n)

示例:

java 复制代码
Map<String, Integer> map = new TreeMap<>();

适用场景:

  • 需要排序后的 key

LinkedHashMap

LinkedHashMap 是 Java 集合框架中的一个 Map 实现类,它的核心特点是:

👉 既是 HashMap(基于哈希表),又能保持元素的顺序


java 复制代码
Map<K, V> map = new LinkedHashMap<>();

本质上:

  • 继承自 HashMap
  • 额外维护了一个双向链表

三、LinkedHashMap 的"顺序"是什么?

默认是:

👉 插入顺序(Insertion Order)

示例:

java 复制代码
Map<String, Integer> map = new LinkedHashMap<>();

map.put("A", 1);
map.put("C", 3);
map.put("B", 2);

System.out.println(map);

输出:

text 复制代码
{A=1, C=3, B=2}

👉 顺序就是你 put 的顺序


四、为什么它能保持顺序?

内部结构:

复制代码
HashMap(快速查找)
     +
双向链表(维护顺序)

每个节点类似:

text 复制代码
[prev] ← node → [next]

所以:

  • 查找:O(1)
  • 遍历:按顺序走链表


九、回到你的代码为什么用它
java 复制代码
Map<String, String> map = new LinkedHashMap<>();

👉 目的很明确:

  • 保证:

    • 读取文件 → 顺序不乱
    • 写回文件 → 顺序一致

否则如果用 HashMap:

text 复制代码
每次写出来顺序都可能不同 ❌
相关推荐
❀͜͡傀儡师4 分钟前
Spring AI 集成 TypeSafe:用判断模型处理工单分流与链路决策
java·人工智能·spring
bro_Java6667 分钟前
《栈与队列:数据结构的“双生花”》
java·数据结构·编辑器
花开路口8 分钟前
线程安全完全指南:从 Java 到 Kotlin,一文吃透并发编程
java·kotlin
她说..15 分钟前
IntelliJ IDEA 快捷键速查表(Mac 版)
java·macos·intellij-idea
码匠许师傅23 分钟前
【C++三方组件】Asio 上篇:回调式 TCP 客户端与服务端
开发语言·c++·tcp/ip
EatFan23 分钟前
JunoYi 框架实践:Spring Boot 项目为什么拆成 framework、module、server 三层?
java·spring boot·后端·framework·module·模块化·junoyi
神仙别闹29 分钟前
基于C语言实现 TINY+ 编译器
c语言·开发语言·数据库
Wang's Blog33 分钟前
Java 项目实战: 外卖平台优化-从库Slave配置与主从复制验证
java·开发语言
子一!!37 分钟前
集成Spring家族的Spring论坛实战==一阶段
java·后端·spring
何中应40 分钟前
Maven 执行控制台中文乱码问题
java·maven·intellij-idea