说明:本文介绍 Java 中 LinkedHashMap 的使用。
与 HashMap 的区别
LinkedHashMap,是 HashMap 的子类,是在 HashMap 的基础上维护了双向链表。
这就让 LinkedHashMap 中的元素能保持有序,按元素插入的顺序。

使用
在实际的使用中,双列集合,除了需要元素保持有序,我们可以使用 LinkedHashMap。
LinkedHashMap 还能当作最近最少使用(LRU)的缓存容器来使用,如下:
java
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 最近最少使用(LRU)的缓存容器
*/
public class LinkedHashMapCache extends LinkedHashMap<String, Object> {
/**
* 缓存最大容量
*/
private final int maxCapacity;
public LinkedHashMapCache(int maxCapacity) {
super(maxCapacity, 0.75f, true);
this.maxCapacity = maxCapacity;
}
/**
* 超出最大容量,移除最近最少使用的元素
* 最近最少使用的标准:最近未被访问的元素
*/
@Override
protected boolean removeEldestEntry(Map.Entry<String, Object> eldest) {
return size() > maxCapacity;
}
}
使用,存满容器后再存入一个元素,查看容器内的元素情况
java
public class LinkedHashMapDemo {
public static void main(String[] args) {
LinkedHashMapCache linkedHashMapCache = new LinkedHashMapCache(6);
linkedHashMapCache.put("1", "a");
linkedHashMapCache.put("2", "b");
linkedHashMapCache.put("3", 1);
linkedHashMapCache.put("4", "d");
linkedHashMapCache.put("5", "e");
linkedHashMapCache.put("6", "f");
System.out.println("init:" + linkedHashMapCache);
linkedHashMapCache.get("1");
linkedHashMapCache.get("2");
linkedHashMapCache.put("3", Integer.parseInt(linkedHashMapCache.get("3").toString()) + 1);
linkedHashMapCache.put("7", "g");
System.out.println("used:" + linkedHashMapCache);
}
}
以下结论:
-
存入的元素有序,开始按元素插入顺序,元素被访问后移到末尾;
-
容器存满后,再存入一个元素,放到容器末尾,删除首位元素;

基于 LinkedHashMap 以上特性,可以作为一个最近最少访问(LRU)的缓存容器使用。
实际场景,如系统中需要体现最近系统活跃的十个用户信息,就可以用 LinkedHashMap。
(当然,存对象,需要重写 equals 和 hashCode 方法,或者也可以存用户 ID,展示时再用这些 ID 集合查数据库的用户信息)