当前位置: 首页 > news >正文

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

文章目录

  • 怎么选
  • 1. `HashMap`
  • 2. `LinkedHashMap`
  • 3. `Hashtable`
  • 4. `ConcurrentHashMap`
  • 5. `WeakHashMap`
  • 6. `IdentityHashMap`
  • 7. `EnumMap`
  • 8. `TreeMap`
    • LinkedHashMap
        • 三、LinkedHashMap 的“顺序”是什么?
        • 四、为什么它能保持顺序?
        • 九、回到你的代码为什么用它

常见的 “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
  • 线程不安全

示例:

Map<String,Integer>map=newHashMap<>();map.put("a",1);

适用场景:

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

2.LinkedHashMap

你刚问到的这个。

特点:

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

示例:

Map<String,Integer>map=newLinkedHashMap<>();

适用场景:

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

3.Hashtable

比较老的类。

特点:

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

示例:

Map<String,Integer>map=newHashtable<>();

适用场景:

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

4.ConcurrentHashMap

并发环境最常见。

特点:

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

示例:

Map<String,Integer>map=newConcurrentHashMap<>();

适用场景:

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

5.WeakHashMap

特殊用途。

特点:

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

示例:

Map<Object,String>map=newWeakHashMap<>();

适用场景:

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

6.IdentityHashMap

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

特点:

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

示例:

Map<String,Integer>map=newIdentityHashMap<>();

比如:

Stringa=newString("x");Stringb=newString("x");

在普通HashMap里,ab认为是同一个 key。
IdentityHashMap里,它们不是同一个 key。

适用场景:

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

7.EnumMap

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

特点:

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

示例:

enumStatus{NEW,RUNNING,DONE}Map<Status,String>map=newEnumMap<>(Status.class);

适用场景:

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

8.TreeMap

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

特点:

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

示例:

Map<String,Integer>map=newTreeMap<>();

适用场景:

  • 需要排序后的 key

LinkedHashMap

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

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


Map<K,V>map=newLinkedHashMap<>();

本质上:

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

三、LinkedHashMap 的“顺序”是什么?

默认是:

👉 插入顺序(Insertion Order)

示例:

Map<String,Integer>map=newLinkedHashMap<>();map.put("A",1);map.put("C",3);map.put("B",2);System.out.println(map);

输出:

{A=1, C=3, B=2}

👉 顺序就是你put的顺序


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

内部结构:

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

每个节点类似:

[prev] ← node → [next]

所以:

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


九、回到你的代码为什么用它
Map<String,String>map=newLinkedHashMap<>();

👉 目的很明确:

  • 保证:

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

否则如果用HashMap

每次写出来顺序都可能不同 ❌
http://www.jsqmd.com/news/658391/

相关文章:

  • 负载箱与电网质量的相互影响:用户应知的技术事实与应对策略
  • 深入RT-Thread BSP引擎:从Kconfig选项到SCons脚本,彻底搞懂STM32工程构建的里子
  • 图片去水印 API 哪个好?5种方案实测对比(附避坑指南 + 免费在线体验)
  • 杀疯了!Claude Opus 4.7 突袭发布,多项能力登顶第一
  • 保姆级教程:用Scikit-learn的train_test_split和cross_val_score搞定数据集划分与交叉验证
  • Cadence 17.2 allegro如何导出封装库-library
  • 跨越桌面与移动的边界:Windows 10如何无缝融合Android应用生态?
  • ODI备案代办
  • 为什么Google Brain团队在SITS2026圆桌突然终止演示?背后是智能代码生成的“第三道红线”:训练数据版权溯源不可绕行(附法律+技术双轨应对方案)
  • 虚拟化赛道大洗牌,Infortrend存储带Proxmox VE-凭硬核实力成为企业替代方案首选
  • 告别字典盲打:用BurpSuite Intruder对DVWA密码爆破进行结果智能分析与过滤实战
  • 2026供应商审核重点:5大维度+AI工具应用指南
  • 告别百度看病:我用 Nexent 手搓了一个宠物急救与健康管家
  • 在idea中怎么把目录(directory)转成模块
  • K8s 集群安全加固措施
  • SITS2026案例深度复盘:从Prompt工程到可交付React组件,AI生成前端代码的7步工业化流水线
  • 用STM32F103C8T6和CubeMX做个密码锁,我踩过的OLED显示和矩阵按键的坑都在这了
  • 15.5k Star项目的作者,连个申诉入口都找不到
  • uni-app怎么做横向滚动导航 uni-app滚动菜单Tab实现教程【代码】
  • AC220V转12V 0.5A可替代KP15051非隔离降压转换芯片_AH8966
  • 别再追二手热点了!Hermes Agent 爆火,我是这么知道的
  • 测评|鸿达辉科技自动点胶机真实表现:五款机型、服务与选购建议
  • 深度解析Winhance:模块化Windows系统优化与定制终极方案
  • Chapter 12: Physical Layer - Logical (Gen3)
  • 迪普防火墙SNAT策略配置问题
  • AI编程革命:用Codex告别重复造轮子
  • 23种设计模式以及对应的三种分类——快速及仪表——自留用
  • 【和风天气】开始使用:天气API请求 城市编码API请求
  • 不同材质工件(塑胶/金属/镀锌件)喷漆加工的工艺差异
  • 基于STM32LXXX的无线收发芯片(SI4463-C2A-GMR)应用程序设计