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


    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。(

  • 相关阅读:
    web基础(Myeclipse、IDEA新建Servlet工程)
    web基础(myeclipse新建web工程、tomcat服务器)
    http协议(http请求、响应、抓包、get和post请求)
    jsp(简介、脚本和注释、运行原理)
    类与对象(类、对象、对象的比较)
    变量(成员变量、局部变量)、堆栈
    目录的基本操作
    目录切换命令
    数组(一维数组、二维数组、与数组相关的函数)
    流程控制(顺序结构、条件语句、选择语句、循环语句)
  • 原文地址:https://www.cnblogs.com/finalstar/p/2335247.html
Copyright © 2020-2023  润新知