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 keynull 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 keynull value
  • 性能通常不如现代方案
  • 现在一般不推荐新项目直接用

示例:

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

适用场景:

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

4. ConcurrentHashMap

并发环境最常见。

特点:

  • 线程安全
  • 性能比 Hashtable 更好
  • 不允许 null keynull 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 里,ab 认为是同一个 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 复制代码
每次写出来顺序都可能不同 ❌
相关推荐
Co_Hui2 分钟前
Java 并发编程
java
cm04Z9c9135 分钟前
C#摸鱼实录——IoC与DI案例详解
开发语言·c#
long3161 小时前
Java 新手入门与实战开发指南
java·开发语言
摩西蒙1 小时前
计算机网络
开发语言·计算机网络·php
山峰哥1 小时前
数据库性能救星:Explain执行计划深度拆解
服务器·开发语言·数据库·sql·启发式算法
执笔画流年呀1 小时前
Linux搭建Java项目部署环境
java·linux·运维
程序员天天困2 小时前
Arthas ognl 表达式从入门到实战:掌握在线调试最强的表达式引擎
java·jvm·后端
IT_Octopus2 小时前
Spring Boot 中 ThreadLocal 请求上下文的完整生命周期
java·spring boot·spring
小罗水2 小时前
第8章 文档解析与文本切片
数据库·spring·spring cloud·微服务
用户40966601317513 小时前
Lombok 你用对了吗?@Data 之外的 6 个隐藏神器
java·后端·代码规范