先看下LinkedHashMap的数据结构图算法
对于LinkedHashMap而言,它继承与HashMap、底层使用哈希表与双向链表来保存全部元素。其基本操做与父类HashMap类似,它经过重写父类相关的方法,来实现本身的连接列表特性。根据链表中元素的顺序能够分为:按插入顺序的链表,和按访问顺序(调用get方法)的链表。数组
LinkedHashMap采用的hash算法和HashMap相同,可是它从新定义了数组中保存的元素Entry,该Entry除了保存当前对象的引用外,还保存了其上一个元素before和下一个元素after的引用,从而在哈希表的基础上又构成了双向连接列表。数据结构
LinkedHashMap定义了排序模式accessOrder,该属性为boolean型变量,对于访问顺序,为true;对于插入顺序,则为false。ide
当有新元素加入Map的时候会调用Entry的addEntry方法,会调用removeEldestEntry方法,这里就是实现LRU元素过时机制的地方,默认的状况下removeEldestEntry方法只返回false表示元素永远不过时spa
public class Tester { private static int MAX=5; /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub HashMap<String,String> map = new LinkedHashMap<String, String>(MAX/2,0.5f,true) { @Override protected boolean removeEldestEntry(Map.Entry<String, String> eldest){ if(size()>MAX){ return true; } return false; } }; map.put("a", "a"); map.put("b", "b"); map.put("c", "c"); map.put("d", "d"); map.put("e", "e"); map.put("c", "c"); for (Map.Entry<String, String> entry : map.entrySet()) { System.out.print(entry.getValue() + ", "); } System.out.println(); map.get("b"); for (Map.Entry<String, String> entry : map.entrySet()) { System.out.print(entry.getValue() + ", "); } System.out.println(); map.put("f", "f"); for (Map.Entry<String, String> entry : map.entrySet()) { System.out.print(entry.getValue() + ", "); } System.out.println(); } }
a, b, d, e, c,
a, d, e, c, b,
d, e, c, b, f, code
可见最新加入的或者最近get过的就会往最后放,若是put数目大于max,就会把头上那个去掉,而后f加到最后,其余往前移。对象
因此说不仅是put,get也会把Entry日后方,越日后的说明最近才访问过的,越往前的说明最近最少访问的,这就实现了一个简单的LRU。blog
参考:排序