java基础之 LinkedHashMap

199 阅读1分钟

    

public class LinkedHashMap<K,V>    extends HashMap<K,V>    implements Map<K,V>{}

LinkedHashMap是实现Map 继承自HashMap,具有可预知的迭代顺序。

 LinkedHashMap实现与HashMap的不同之处在于,后者维护着一个运行于所有条目的双向链表。

此链表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。

根据链表中元素的顺序可以分为:按插入顺序的链表,和按访问顺序(调用get方法)的链表。默认是按插入顺序排序,如果指定按访问顺序排序,那么调用get方法后,会将这次访问的元素移至链表尾部,不断访问可以形成按访问顺序排序的链表。 可以重写removeEldestEntry方法返回true值指定插入元素时移除最老的元素。

下面通过一个例子来看看它在LRU 缓存中的用法:

        final int initialCapacity = 10;//初始化容量
        float loadFactor = 0.75f;//加载因子,一般是 0.75f
        boolean accessOrder = true;//排序方式 false 基于插入顺序  true  基于访问顺序
        //Map<String, Integer> map = new LinkedHashMap<>(initialCapacity, loadFactor, accessOrder);
        Map<String, Integer> map = new LinkedHashMap(initialCapacity, loadFactor, accessOrder) {

            @Override
            protected boolean removeEldestEntry(Entry eldest) {
                return size() > initialCapacity;
            }
        };
        for (int i = 0; i < 15; i++) {
            map.put(String.valueOf(i), i);
        }
        //访问前顺序
        for (Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator(); it.hasNext(); ) {
            Map.Entry<String, Integer> next = it.next();
            Log.e(TAG, "linkedMap--before-->" + next.getKey());
        }

我们容量定的10个,我们插入15个 我们发现最先插入的五个不见了,说明LRU算法起到效果了。