介绍
LinkedHashMap 是 HashMap 的子类,在 HashMap 的基础上维护了一个双向链表,用于记录元素的插入顺序或访问顺序。因此 LinkedHashMap 既具有 HashMap 的高效查找能力,又能保持元素的顺序。 LinkedHashMap 的特点:- 有序性:可以按照插入顺序或访问顺序遍历元素
- 继承 HashMap:拥有 HashMap 的所有特性
- 支持 LRU:可用于实现 LRU(最近最少使用)缓存
- 非线程安全:与 HashMap 一样,不是线程安全的
数据结构
LinkedHashMap 在 HashMap 的基础上,增加了双向链表来维护顺序:常用 API
LinkedHashMap 继承自 HashMap,API 与 HashMap 基本一致:底层实现
Entry 节点
LinkedHashMap 的 Entry 继承自 HashMap.Node,增加了 before 和 after 指针:成员变量
构造方法
创建节点
LinkedHashMap 重写了 HashMap 的 newNode 方法:get 方法
删除节点后的处理
removeEldestEntry 方法
这是一个钩子方法,用于实现 LRU 缓存:实现 LRU 缓存
利用 LinkedHashMap 可以轻松实现 LRU 缓存:遍历顺序示例
插入顺序(默认)
访问顺序
LinkedHashMap vs HashMap
| 特性 | HashMap | LinkedHashMap |
|---|---|---|
| 遍历顺序 | 无序 | 有序(插入/访问顺序) |
| 数据结构 | 数组 + 链表/红黑树 | 数组 + 链表/红黑树 + 双向链表 |
| 内存占用 | 较少 | 较多(额外的链表指针) |
| 性能 | 略高 | 略低(维护链表开销) |
| 适用场景 | 一般场景 | 需要保持顺序、LRU 缓存 |
小结
- LinkedHashMap 继承自 HashMap,在 HashMap 基础上增加了双向链表维护顺序
- 支持插入顺序和访问顺序两种遍历方式
- 通过重写
removeEldestEntry方法可以轻松实现 LRU 缓存 - 相比 HashMap 有额外的内存和性能开销
- 适用于需要保持元素顺序的场景