深入了解 Java 各种容器(三)
2024-10-28 08:52:07
# Technical
# JavaBase
此篇了解 LinkedHashSet 与 LinkedHashMap
继承了 HashMap 的 LinkedHashMap 拥有 HashMap 所有的特点,除此之外,LinkedHashMap 还通过双向链表保证了元素的有序
LinkedHashMap 源码只有 700 来行,主要通过重写 HashMap 的方法来增加功能
基础属性与方法
首先从构造方法开始,LinkedHashMap 对外提供 5 中构造方法
1 | // 无参构造 |
LinkedHashMap 中多了一个属性 accessOrder
排序模式,如果为 true 表示按访问顺序,false 表示按插入顺序
另外还有两个关键的属性
1 | // 链表头元素 |
双向链表的静态内部类节点
1 | static class Entry<K,V> extends HashMap.Node<K,V> { |
重写方法
LinkedHashMap 对 HashMap 重写的方法是其核心
1 | void reinitialize() { |
有序性
可以通过 LinkedHashMap 的 accessOrder 属性控制其内部元素的顺序
1 | public class LinkedHashMapExample { |
LRU 缓存
利用 LinkedHashMap
的访问顺序特性,可以轻松实现一个 LRU(Least Recently Used,最近最少使用)缓存。只需要在构造 LinkedHashMap
时设置 accessOrder
为 true
,并覆盖 removeEldestEntry
方法,使其在缓存大小超过指定容量时自动删除最久未访问的条目
1 | public class LRUCache<K, V> extends LinkedHashMap<K, V> { |
LinkedHashSet
和 HashSet 一样,LinkedHashSet 也是对 LinkedHashMap 的封装,本质依然是 LinkedHashMap