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 复制代码
每次写出来顺序都可能不同 ❌
相关推荐
离陌在学C#7 分钟前
C# 事件(Event)详解:从概念到实战
开发语言·c#
0x5322 分钟前
网站通信(一)
java
Terra.K30 分钟前
Java异常学习[特殊字符]
java·开发语言·学习
葡萄城技术团队2 小时前
InfluxDB 2\.x 深度解析:核心架构、Flux 函数与制造业落地指南(三)
java·开发语言·架构
Super 含2 小时前
Android 启动优化(五):线程、GC 与 IO 为什么会拖慢启动?
java·服务器·数据库
counting money2 小时前
Java IO流详解:从InputStream到文件操作实战
java·开发语言·python
wuyk5552 小时前
98.C语言易混难点:字符数组与字符串指针的底层差异
c语言·开发语言·c++·stm32·嵌入式硬件·算法
峥无3 小时前
从0到1手撕红黑树:封装实现 my_map 与 my_set(SGI-STL 源码级深度解析)
开发语言·c++·笔记·算法·stl
波特率1152003 小时前
C++新特性---属性说明符与标准属性
开发语言·c++
程序员小八7773 小时前
上海百度B端java后端日常实习一面
java·开发语言