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

TreeMap 和 LinkedHashMap原理介绍

🌳 一、TreeMap

1. 用法

import java.util.*;public class DemoTreeMap {public static void main(String[] args) {TreeMap<Integer, String> map = new TreeMap<>();map.put(3, "C");map.put(1, "A");map.put(2, "B");System.out.println(map); // {1=A, 2=B, 3=C}// 获取最小、最大 keySystem.out.println("最小key: " + map.firstKey()); // 1System.out.println("最大key: " + map.lastKey());  // 3}
}

👉 特点:

  • 自动排序(默认升序,基于 key
  • 不允许 key 为 null(因为要比较)
  • 底层是 红黑树

2. 原理图解

TreeMap 是一棵 红黑树,插入时会进行旋转和染色保证平衡。

例子:map.put(3,"C"), map.put(1,"A"), map.put(2,"B")

插入 3:          3(C)插入 1:        3(C)/1(A)插入 2:        2(B)/     \1(A)    3(C)

👉 插入后 TreeMap 会自动保持有序,最终是 {1=A, 2=B, 3=C}


🔗 二、LinkedHashMap

1. 用法

import java.util.*;public class DemoLinkedHashMap {public static void main(String[] args) {LinkedHashMap<Integer, String> map = new LinkedHashMap<>();map.put(3, "C");map.put(1, "A");map.put(2, "B");System.out.println(map); // {3=C, 1=A, 2=B}}
}

👉 特点:

  • 保持 插入顺序
  • 也可以配置为 访问顺序(常用于 LRU 缓存

2. 原理图解

LinkedHashMap = HashMap + 双向链表

例子:插入顺序 3 -> 1 -> 2

哈希表结构 (快速查找):3 -> "C"1 -> "A"2 -> "B"双向链表结构 (保持顺序):Head <-> 3("C") <-> 1("A") <-> 2("B") <-> Tail

👉 因为有链表,所以遍历时顺序稳定。


📊 三、TreeMap vs LinkedHashMap 对比

特性TreeMapLinkedHashMap
底层结构红黑树(平衡二叉树)HashMap + 双向链表
key 是否有序✅ 自动排序(按 key 大小)✅ 插入顺序(或访问顺序)
查找效率O(logN)O(1) 平均
使用场景需要排序,如排行榜、区间查询保持插入顺序,如缓存、序列化

🔗 一、LinkedHashMap 内部结构(顺序保证版的 HashMap)

  1. 继承关系
public class LinkedHashMap<K,V>extends HashMap<K,V>implements Map<K,V>

👉 它完全基于 HashMap,只是在 Node 上增加了 before / after 两个指针,形成一个 双向链表,保证遍历时的顺序。

  1. 内部节点结构
static class Entry<K,V> extends HashMap.Node<K,V> {Entry<K,V> before, after; // 前驱和后继
}

结构示意:

table 哈希桶:table[0] -> Entry1table[1] -> Entry2table[2] -> Entry3双向链表(插入顺序/访问顺序):Head <-> Entry1 <-> Entry2 <-> Entry3 <-> Tail
  1. 特点

默认维护 插入顺序。

通过 accessOrder = true 可维护 访问顺序(最经典场景是 LRU 缓存)。

查询效率和 HashMap 一样 O(1),但是遍历时有序。

额外的内存消耗:链表指针。

🌳 二、TreeMap 内部结构(有序集合)

  1. 底层实现

TreeMap 是基于 红黑树(自平衡二叉搜索树)。

所有键都会按 自然顺序(Comparable) 或者 自定义 Comparator 排序。

  1. 节点结构
static final class Entry<K,V> implements Map.Entry<K,V> {K key;V value;Entry<K,V> left;Entry<K,V> right;Entry<K,V> parent;boolean color; // 红 / 黑
}
  1. 树形结构示例
假设插入 50, 30, 70, 20, 40:50(黑)/     \30(红)     70(红)/   \
20(黑) 40(黑)

👉 红黑树保证了 平衡性,查找、插入、删除的复杂度都是 O(logN)。

  1. 特点

有序性:天然支持按 key 排序。

区间查询:subMap, headMap, tailMap。

查找效率比 HashMap 差(O(logN) vs O(1)),但是有序特性是它的最大价值。

⚡ 三者对比:HashMap vs LinkedHashMap vs TreeMap

特性HashMapLinkedHashMapTreeMap
底层结构数组 + 链表 + 红黑树(冲突时树化)HashMap + 双向链表红黑树
Key 顺序无序 插入顺序 / 访问顺序排序(升序 / 自定义 Comparator)
查询复杂度O(1) 平均O(1)平均O(logN)
插入复杂度O(1) 平均O(1) 平均(多维护链表)O(logN)
内存开销较多(额外链表指针)较多(红黑树节点结构)
典型场景快速查找,不关心顺序LRU 缓存、日志有序输出排行榜、区间查询、排序集合

🎨 总结图示

TreeMap (红黑树):2/ \1   3LinkedHashMap (链表):Head <-> 3 <-> 1 <-> 2 <-> Tail
  • 想要 排序 👉 用 TreeMap
  • 想要 顺序一致 👉 用 LinkedHashMap
  • 想要 最快的查找 👉 用 HashMap

文章转载自:

http://CWDcSOPU.bpmnz.cn
http://Hdyviht6.bpmnz.cn
http://TWawgszO.bpmnz.cn
http://pFVnR9Me.bpmnz.cn
http://0UDKwBjY.bpmnz.cn
http://bZe3Q6zT.bpmnz.cn
http://8yBzsKsn.bpmnz.cn
http://UsF3lcp3.bpmnz.cn
http://pBP706QQ.bpmnz.cn
http://NZFSOANg.bpmnz.cn
http://ioCGtv3X.bpmnz.cn
http://j0ncDGHo.bpmnz.cn
http://EBvTGDbc.bpmnz.cn
http://M9ZTOTSc.bpmnz.cn
http://rXqCkmPf.bpmnz.cn
http://QAfm2xku.bpmnz.cn
http://5qrawZMk.bpmnz.cn
http://h7v6qKR4.bpmnz.cn
http://qlajAaj0.bpmnz.cn
http://F7Kxpiou.bpmnz.cn
http://K5WwgnzH.bpmnz.cn
http://kiM1W6TH.bpmnz.cn
http://Jqx6MkOc.bpmnz.cn
http://vYPgr30O.bpmnz.cn
http://JPlkeFC9.bpmnz.cn
http://LDbXeOKP.bpmnz.cn
http://svlJR2lp.bpmnz.cn
http://gupaJ6J4.bpmnz.cn
http://vMku7ixT.bpmnz.cn
http://1QbBriWv.bpmnz.cn
http://www.dtcms.com/a/367714.html

相关文章:

  • 手写智能指针:带你彻底搞懂 C++ 内存管理的底层逻辑
  • MySQL中CASE语法规则的详细解析及扩展示例
  • 基于单片机楼宇火灾检测系统/仓库火灾检测报警系统
  • 基础crud项目(前端部分+总结)
  • 从零开始学大模型之预训练语言模型
  • 大语言模型基础-Transformer之上下文
  • 数字签名、数字证书、数字信封的概念与区别
  • 【C语言】深入理解指针(5)
  • 240. 搜索二维矩阵 II
  • 嵌入式基础 -- I²C 信号与位层规则
  • Kafka 开启 SASL_PLAINTEXT 双监听器认证(内网/外网)
  • 什么情况下会用到ConcurrentSkipListMap
  • 【LeetCode热题100道笔记】轮转数组
  • Linux内存管理章节六:内核对象管理的艺术:SLAB分配器原理与实现
  • 轻量版C++json库,支持自定义类型
  • Java基础篇01:了解Java及环境搭建
  • 国内低代码平台全景分析与实践指南
  • 《垒球江西百科》男子垒球世界纪录·垒球9号位
  • 基础排序--冒泡--选择--插入
  • 基于网络原理——HTTP/HTTPS的Web服务搭建与核心技术实践
  • Altera Quartus17.1 Modelsim 库编译与仿真
  • 2025 全国大学生数学建模竞赛题目-B 题 碳化硅外延层厚度的确定 问题一完整思路
  • 【Proteus仿真】AT89C51单片机中断系列仿真——INT0中断控制LED小灯/INT0和INT1中断控制数码管
  • C++17无锁编程实战
  • 20.35 ChatGLM3-6B QLoRA实战:4bit量化+低秩适配,显存直降70%!
  • Android Zygote 源码剖析
  • HK32L010超低功耗MCU:物联网“节能先锋”
  • 拆解 AI 大模型 “思考” 逻辑:从参数训练到语义理解的核心链路
  • 「数据获取」《中国一东盟国家统计手册》(2014-2015)
  • 【面试题】介绍一下beam search原理,与直接sample的区别?