LinkedHashMap 特性 按插入和访问顺序排序

转载 2006年06月07日 13:11:00
LinkedHashMap extends HashMap

LinkedHashMap的特性:
Linked内部含有一个private transient Entry header;来记录元素插入的顺序或者是元素被访问的顺序。利用这个线性结构的对象,可以帮助记录entry加入的前后顺序或者记录entry被访问的频率(最少被访问的entry靠前,最近访问的entry靠后)。大致的过程如下:

new LinkedHashMap(10, 0.75, true);
其中前面两个参数就是HashMap构造函数需要的参数,后面的true表明LinkedHashMap按照访问的次序来排序。
按照访问的次序来排序的含义:当调用LinkedHashMap的get(key)或者put(key, value)时,碰巧key在map中被包含,那么LinkedHashMap会将key对象的entry放在线性结构的最后。
按照插入顺序来排序的含义:调用get(key), 或者put(key, value)并不会对线性结构产生任何的影响。

正是因为LinkedHashMap提供按照访问的次序来排序的功能,所以它才需要改写HashMap的get(key)方法(HashMap不需要排序)和HashMap.Entry的recordAccess(HashMap)方法
public Object get(Object key) {
        Entry e = (Entry)getEntry(key);
        if (e == null)
            return null;
        e.recordAccess(this);
        return e.value;
    }

void recordAccess(HashMap m) {
            LinkedHashMap lm = (LinkedHashMap)m;
            if (lm.accessOrder) {
                lm.modCount++;
                remove();
                addBefore(lm.header);
            }
        }
注意addBefore(lm.header)是将该entry放在header线性表的最后。(参考LinkedHashMap.Entry extends HashMap.Entry 比起HashMap.Entry多了before, after两个域,是双向的)

至于put(key, value)方法, LinkedHashMap不需要去改写,用HashMap的就可以了,因为HashMap在其put(key, value)方法里边已经预留了e.recordAccess(this);

还有一个方法值得关注:
    protected boolean removeEldestEntry(Map.Entry eldest) {
        return false;
    }
当调用put(key, value)的时候,HashMap判断是否要自动增加map的size的作法是判断是否超过threshold, LinkedHashMap则进行了扩展,如果removeEldestEntry方法return false;(默认的实现),那么LinkedHashMap跟HashMap处理扩容的方式一致;如果removeEldestEntry返回true,那么LinkedHashMap会自动删掉最不常用的那个entry(也就是header线性表最前面的那个)。

正如LinkedHashMap的文档所说,LinkedHashMap简直就是为了实现LRU Cache(Least Recently Used)而编写的。正因为如此,在oscache或者是ehcache都使用到了LinkedHashMap。(oscache中是否使用LRU是可以配置的)

LinkedHashMap特性 按插入和访问顺序排序

LinkedHashMap的特性: Linked内部含有一个private transient Entry header;来记录元素插入的顺序或者是元素被访问的顺序。利用这个线性结构的对象,可以帮助...

LinkedHashMap特性 按插入和访问顺序排序

LinkedHashMap的特性: Linked内部含有一个private transient Entry header;来记录元素插入的顺序或者是元素被访问的顺序。利用这个线性结构的对象,可以帮助...
  • Hsuxu
  • Hsuxu
  • 2012年04月12日 15:55
  • 5046

Java容器类浅析三-----保证插入顺序的HashMap--LinkedHashMap的存取原理

一、概述 可排序的HashMap--LinkedHashMap

LinkedHashMap的特性:

LinkedHashMap的特性 LinkedHashMap的特性: Linked内部含有一个private transient Entry header;来记录元素插入的顺序或者是元...

LinkedHashMap按存放顺序迭代

import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import java.util.Ma...

HashMap,LinkedHashMap 和 TreeMap 的排序研究

关于HashMap,LinkedHashMap 和 TreeMap放入值的默认排序从网上看了些文章, 今天想做个例子研究一下   MapTest.java package org.maptes...

使用LinkedHashMap进行分数排序

分数排序的特殊问题 在java中实现排序远比C/C++简单,我们只要让集合中元素对应的类实现Comparable接口,然后调用Collections.sort();方法即可. 这种方法对于排序...
  • MF_Mofy
  • MF_Mofy
  • 2017年12月08日 14:27
  • 12

Java HashMap(LinkedHashMap)与Hashset(LinkedHashSet)的排序

Java HashMap(LinkedHashMap)与Hashset(LinkedHashSet)的排序 为什么要单独说HashMap和HashSet的排序问题? 1.首先先总结一下一些基本的...

LinkedHashMap与TreeMap的排序问题

java集合框架非常好的封装了对数据基本处理的底层实现细节,可以直接调用API完成对数据的基本的操作,它们之间的关系就不累述了,这里主要想谈下LinkedHashMap与TreeMap的排序问题。 L...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LinkedHashMap 特性 按插入和访问顺序排序
举报原因:
原因补充:

(最多只允许输入30个字)