LinkedHashMap用法以及相关LRU cache实现
package learnthread.basic; import java.util.LinkedHashMap; import java.util.Map.Entry; /** * LinkedHashMap采用hashmap和双向链表实现 accessOrder为true时 双向链表中的顺序呢为访问顺序 * 为false时双向链表中的顺序为节点插入顺序 * * @author li * */ public class LinkedHashMapTest { public static void main(String[] args) { LinkedHashMap<String, Integer> map = new LinkedHashMap<String, Integer>( 4, 0.75f, true); map.put("1", 1); map.put("2", 1); map.put("3", 1); map.put("4", 1); map.get("2"); map.get("4"); for (Entry<String, Integer> entry : map.entrySet()) { System.out.println(entry.toString()); } } }
当设置为true时,双向链表中保存的是访问顺序,因此此程序的输出结果为:
1=1
3=1
2=1
4=1
利用LinkedHashmao实现lru cache的关键为,覆盖
//该方法返回为true的时候则删除最老节点,返回为false的时候则不做操作
protected boolean removeEldestEntry(Map.Entry<K,V> eldest) { return false; }
package learnthread.basic; import java.util.LinkedHashMap; import java.util.Map; public class LRUCache<K, V> extends LinkedHashMap<K, V> { private final int MAX_CACHE_SIZE; public LRUCache(int size) { super((int) Math.ceil(size / 0.75) + 1, 0.75f, true);//防止发生扩容 MAX_CACHE_SIZE = size; } /** * 返回true的时候则从双向链表中删除头部节点 ,为false时则不删除 */ @Override protected boolean removeEldestEntry(Map.Entry<K, V> eldest) { return size() > MAX_CACHE_SIZE; } @Override public String toString() { StringBuilder sb = new StringBuilder(); for (Map.Entry<K, V> entry : entrySet()) { sb.append(String.format("%s:%s ", entry.getKey(), entry.getValue())); } return sb.toString(); } public static void main(String[] args) { LRUCache<String, Integer> cache = new LRUCache<>(3); cache.put("1", 1); cache.put("2", 2); cache.put("3", 3); System.out.println(cache.toString()); cache.put("4", 4); System.out.println(cache.toString()); } }
输出结果为:
1:1 2:2 3:3
2:2 3:3 4:4

浙公网安备 33010602011771号