//LinkedHashMap的一個構造函數,當參數accessOrder為true時,即會按照訪問順序排序,最近訪問的放在最前,最早訪問的放在后面 public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) { super(initialCapacity, loadFactor); this.accessOrder = accessOrder; }
LRU是Least Recently Used 的縮寫,翻譯過來就是“最近最少使用”,LRU緩存就是使用這種原理實現,簡單的說就是緩存一定量的數據,當超過設定的閾值時就把一些過期的數據刪除掉,比如我們緩存10000條數據,當數據小於10000時可以隨意添加,當超過10000時就需要把新的數據添加進來,同時要把過期數據刪除,以確保我們最大緩存10000條,那怎么確定刪除哪條過期數據呢,采用LRU算法實現的話就是將最老的數據刪掉,Java版的LRU緩存實現就數linkedHashmap了
LinkedHashMap<Integer, String> linkedHashMap = new LinkedHashMap<>(new CountingMapData(9)); print(linkedHashMap); print("====="); linkedHashMap = new LinkedHashMap<>(16, 0.75f, true); linkedHashMap.putAll(new CountingMapData(9)); print(linkedHashMap); System.out.println("====="); for (int i = 0; i < 6; i++) { linkedHashMap.get(i); } print("--"+linkedHashMap); linkedHashMap.get(0); print("--"+linkedHashMap);
public class CountingMapData extends AbstractMap<Integer,String> { private int size; private static String[] chars = "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z" .split(" "); public CountingMapData(int size) { if(size < 0) this.size = 0; this.size = size; } private static class Entry implements Map.Entry<Integer,String> { int index; Entry(int index) { this.index = index; } public boolean equals(Object o) { return Integer.valueOf(index).equals(o); } public Integer getKey() { return index; } public String getValue() { return chars[index % chars.length] + Integer.toString(index / chars.length); } public String setValue(String value) { throw new UnsupportedOperationException(); } public int hashCode() { return Integer.valueOf(index).hashCode(); } } public Set<Map.Entry<Integer,String>> entrySet() { // LinkedHashSet retains initialization order: Set<Map.Entry<Integer,String>> entries = new LinkedHashSet<Map.Entry<Integer,String>>(); for(int i = 0; i < size; i++) entries.add(new Entry(i)); return entries; } public static void main(String[] args) { System.out.println(new CountingMapData(60)); } }
輸出:
{0=A0, 1=B0, 2=C0, 3=D0, 4=E0, 5=F0, 6=G0, 7=H0, 8=I0} ===== {0=A0, 1=B0, 2=C0, 3=D0, 4=E0, 5=F0, 6=G0, 7=H0, 8=I0} ===== --{6=G0, 7=H0, 8=I0, 0=A0, 1=B0, 2=C0, 3=D0, 4=E0, 5=F0} --{6=G0, 7=H0, 8=I0, 1=B0, 2=C0, 3=D0, 4=E0, 5=F0, 0=A0}