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 复制代码
每次写出来顺序都可能不同 ❌
相关推荐
XMYX-01 小时前
16 - Go 协程(goroutine):从基础到实战
开发语言·golang
一只游鱼1 小时前
langchain4j+redis+持久化存储记忆
java·redis·langchain4j
野生技术架构师2 小时前
牛客网热门Java 面试题汇总,查漏补缺;多线程 +spring+JVM 调优 + 分布式 +redis+ 算法
java·jvm·spring
txxzjmzlh2 小时前
Thread 类的基本用法
java·开发语言
machnerrn2 小时前
matlab实现直流伺服电机 PID 控制系统仿真系统(含源码+资料报告+说明文档等)
开发语言·matlab
Hello--_--World2 小时前
JS:this指向、bind、call、apply、知识点与相关面试题
开发语言·javascript·ecmascript
好家伙VCC2 小时前
**基于RISC-V架构的嵌入式系统开发:从零开始构建高效低功耗应用**在当前物联网(IoT)和边缘计
java·python·物联网·架构·risc-v
wyu729612 小时前
Spring框架学习笔记:从IoC到声明式事务
java
沐知全栈开发2 小时前
CSS Text(文本)
开发语言