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 复制代码
每次写出来顺序都可能不同 ❌
相关推荐
你不是我我5 小时前
【Java 开发日记】HTTP3 性能更好,为什么内网微服务依然多用 HTTP2?HTTP2 内网优势是什么?
java·开发语言·微服务
雪碧聊技术5 小时前
大模型爆火!Java后端如何抓住Agent全栈开发的风口
java·大模型·agent·全栈开发
tjl521314_215 小时前
04C++ 名称空间(Namespace)
开发语言·c++
赏金术士5 小时前
Kotlin 数据流与单双向绑定
android·开发语言·kotlin
逻辑驱动的ken6 小时前
Java高频面试场景题25
java·开发语言·深度学习·面试·职场和发展
AI人工智能+电脑小能手7 小时前
【大白话说Java面试题】【Java基础篇】第32题:Java的异常处理机制是什么
java·开发语言·后端·面试
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ8 小时前
通过java后端代码来实现给word内容补充格式文本内容控件,以及 设置控件的标记和标题
java·c#·word
無限進步D9 小时前
Java 面向对象高级 接口
java·开发语言
逸Y 仙X10 小时前
文章二十七:ElasticSearch ES查询模板(Search Template)高效复用实战
java·大数据·数据库·elasticsearch·搜索引擎·全文检索