public void removeMostUnusedCache() { // 删除头结点 Node<V> rNode = nDLList.removeHead(); K rKey = nodeKeyMap.get(rNode); // hashMap中删除相关内容 nodeKeyMap.remove(rNode); keyNodeMap.remove(rKey); }
// 根据key得到value public V get(K k) { if (keyNodeMap.containsKey(k)) { Node<V> cur = keyNodeMap.get(k); // 最新操作的节点移到队头 nDLList.moveToTail(cur); return cur.value; } else { return null; } }
public void set(K k, V value) { if (keyNodeMap.containsKey(k)) { // 更新节点 Node<V> cur = keyNodeMap.get(k); cur.value = value; // 操作过的节点移到队头 nDLList.moveToTail(cur); } else { // 如果此时窗口达到最大值,则把最久没有用的即头结点去掉 if (keyNodeMap.size() == windowSize) { removeMostUnusedCache(); } // 新增节点 Node<V> newNode = new Node<V>(value); keyNodeMap.put(k, newNode); nodeKeyMap.put(newNode, k); // 移到队尾 nDLList.addToTail(newNode); } }