LinkedHashMap
是 Java 中 Map
接口的一种实现,它继承自 HashMap
类,并且位于 java.util
包中。LinkedHashMap
不仅保留了 HashMap
的快速查找特性,还通过维护一个双向链表来记录元素的插入顺序或访问顺序(根据构造方式的不同)。这使得它在需要保持键值对插入顺序或者访问顺序时非常有用。
主要特点
- 保持插入顺序:默认情况下,
LinkedHashMap
会按照元素插入的顺序进行排序。这意味着当你遍历LinkedHashMap
时,元素将按照它们被插入的顺序返回。 - 可选的访问顺序:通过使用适当的构造函数,你可以创建一个按访问顺序排列的
LinkedHashMap
。在这种模式下,每次对某个键的get
或put
操作都会将该键移到链表的末尾,最近最少使用的条目会靠近链表头部。这种特性对于实现LRU(Least Recently Used)缓存特别有用。 - 性能:与
HashMap
类似,LinkedHashMap
提供了常数时间复杂度 O(1) 的get
和put
操作。但是由于需要维护一个额外的链表,其性能略低于HashMap
。不过,在大多数实际应用场景中,这种差异可以忽略不计。 - 移除最老的条目:
LinkedHashMap
提供了一个可重写的方法removeEldestEntry(Map.Entry<K,V> eldest)
,允许用户定义何时移除最老的条目。结合按访问顺序的特性,可以用来自动限制缓存的大小。 - 线程安全:和
HashMap
一样,LinkedHashMap
不是线程安全的。如果要在多线程环境中使用,需要额外的同步机制,或者使用Collections.synchronizedMap()
方法包装。 - 不允许空键:虽然
LinkedHashMap
允许存储 null 值,但通常只允许有一个 null 键(除非你提供了自定义的equals()
和hashCode()
实现,但这不是推荐的做法)。
应用场景
- 当你需要保持键值对插入顺序或访问顺序时。
- 实现LRU缓存:利用按访问顺序的特点,可以很容易地实现一个LRU缓存策略,当达到设定的最大容量时,自动移除最近最少使用的条目。
总之,LinkedHashMap
结合了哈希表和链表的优点,既保证了快速查找的能力,又能够维护元素的插入顺序或访问顺序。理解它的特性和适用场景有助于更有效地选择和使用适合的数据结构来解决问题。
THE END