HashMap
没有“最老”,没有“第一”,没有秩序。
另一方面,A正是为此而设计的,它在条目之间维护一个双链表,因此请保持它们按插入顺序排列,它还提供了一个 removeEldestEntry
方法:LinkedHashMap
public static void main(final String args[]) throws Exception {
final int maxSize = 4;
final LinkedHashMap<String, String> cache = new LinkedHashMap<String, String>() {
@Override
protected boolean removeEldestEntry(final Map.Entry eldest) {
return size() > maxSize;
}
};
cache.put("A", "A");
System.out.println(cache);
cache.put("B", "A");
System.out.println(cache);
cache.put("C", "A");
System.out.println(cache);
cache.put("D", "A");
System.out.println(cache);
cache.put("E", "A");
System.out.println(cache);
cache.put("F", "A");
System.out.println(cache);
cache.put("G", "A");
}
输出:
{A=A}
{A=A, B=A}
{A=A, B=A, C=A}
{A=A, B=A, C=A, D=A}
{B=A, C=A, D=A, E=A}
{C=A, D=A, E=A, F=A}
大型健康警告
请注意,此实现不是 。如果多个线程同时访问链接的哈希映射,并且至少有一个线程在结构上修改了映射,则它必须在外部进行。这通常是通过自然封装映射的某些对象来实现的。如果不存在此类对象,则应使用该方法“包装”映射。这最好在创建时完成,以防止意外地对地图进行不同步访问:synchronized
synchronized
synchronizing
Collections.synchronizedMap
Map m = Collections.synchronizedMap(new LinkedHashMap(...));
LinkedHashMap
JavaDoc