/** * LinkedHashMap本身就是一个LRU缓存,其数据结构是双链表+hashMap * put操作:把数据放到链表末尾,当超过指定大小后,会删除链表首节点 * get操作:把数据放到链表末尾。 * @param <K> * @param <V> */ static class MyLinkedHashMap<K, V> extends LinkedHashMap<K, V>{ private Integer maxNumber; public MyLinkedHashMap(int initialCapacity, float loadFactor) { super(initialCapacity, loadFactor, true); } public Integer getMaxNumber() { return maxNumber; } public void setMaxNumber(Integer maxNumber) { this.maxNumber = maxNumber; } @Override protected boolean removeEldestEntry(Map.Entry<K, V> eldest) { return size() > getMaxNumber(); // 超过指定的大小会删除head节点 } } public static int[] LRU (int[][] operators, int k) { int[] lruTmp = new int[operators.length]; MyLinkedHashMap<Integer, Integer> map = new MyLinkedHashMap<>(16, 0.75f); map.setMaxNumber(k); int i=0; int j=0; for (int[] op: operators){ if (op.length==3){ map.put(op[1], op[2]); }else { lruTmp[i++]=map.getOrDefault(op[1], -1); j++; } } int[] lru = new int[j]; for (int m=0;m<lruTmp.length; m++){ if (lruTmp[m]!=0){ lru[m]=lruTmp[m]; } } return lru; }