HashMap存放是无序的,当以一定顺序put时候,HashMap是以key的hash值顺序保存的,迭代器遍历时是无序的,有时候我们需要一款以插入顺序返回的map,于是LinkedHashMap应运而生。
LinkedHashMap基于HashMap的实现,只不过在table之外,额外维护了一个双向链表。 实现newNode,afterNodeRemoval等方法方法,put及remove时候维护链表的增减 其内部子类实现Iterator接口,返回链表数据 内部逻辑图如下
利用LinkedHashMap特性实现lru队列很简单,当队列缓存满了,会有限淘汰头部节点,每次get请求会将该节点放置到队列尾,那么头节点就是不经常使用的数据了,利用removeEldestEntry 方法,在put时候判断并淘汰数据。 代码如下 public class MyLruCache<K,V> { private static final float hashTableLoadFactor = 0.75f; private LinkedHashMap<K, V> map; private int cacheSize;
public MyLruCache(int cacheSize) { this.cacheSize = cacheSize; int hashTableCapacity= (int) (Math.ceil(cacheSize/hashTableLoadFactor)+1); map=new LinkedHashMap<K,V>(hashTableCapacity,hashTableLoadFactor,true){ @Override protected boolean removeEldestEntry(Map.Entry<K, V> eldest) { return size() > MyLruCache.this.cacheSize; } }; } public V get(K key){ return map.get(key); } public void put(K key,V value){ map.put(key,value); } public synchronized int usedEntries() { return map.size(); } public synchronized void clear() { map.clear(); } public synchronized Collection<Map.Entry<K, V>> getAll() { return new ArrayList<Map.Entry<K, V>>(map.entrySet()); } } 复制代码
本文参考https://juejin.im/post/5a4b433b6fb9a0451705916f 如果侵权,告知马上处理