LinkedHashMap 是 Java 中 java.util
包中的一个类,它继承自 HashMap
,并在其基础上增加了对元素插入顺序的维护,因此,LinkedHashMap 同时具有哈希表高效查找的特性以及链表能够保持元素插入或访问顺序的优势。
主要特点:
-
双向链表:LinkedHashMap 内部不仅维护了一个哈希表(HashMap),还在每个条目(entry)上增加了前后指针,形成了一个双向链表,这样就可以按照插入顺序或访问顺序(根据配置选项)进行遍历。
-
插入顺序维护:默认情况下,LinkedHashMap 会按照插入顺序保存元素,即第一个插入的元素将是链表的第一个,最后插入的元素将是链表的最后一个。
-
访问顺序维护(LRU缓存):通过设置构造函数参数
accessOrder
为true
,LinkedHashMap 可以变为按访问顺序排列,每当调用get()
方法访问一个元素时,该元素会被移动到链表的尾部,从而最近被访问过的元素总是在链表尾部,适合用于实现 LRU(Least Recently Used)缓存策略。 -
迭代顺序:由于链表的存在,迭代器遍历 LinkedHashMap 的顺序要么是插入顺序要么是访问顺序,而不是像 HashMap 那样完全依赖于哈希值的分布。
-
非线程安全:与 HashMap 相同,LinkedHashMap 也是非线程安全的,若需要在多线程环境下安全使用,需要进行适当的同步控制。
方法及操作:
put(K key, V value)
:插入键值对,同时维护链表顺序。get(Object key)
:获取给定键对应的值,并可触发访问顺序更新。remove(Object key)
:删除给定键对应的条目。removeEldestEntry(Map.Entry<K, V> eldest)
:这是一个受保护的方法,允许子类定制何时删除最老的条目(例如,当达到最大容量时)。
总之,LinkedHashMap 结合了哈希表的高效查找与链表的顺序维护功能,在需要同时满足快速查找和有序遍历的场景中非常有用,例如缓存系统、历史记录列表等。