【集合类分析】LinkedHashMap


LinkedHashMap是直接继承了HashMap的,只不过LinkedHashMap重写了HashMap的一些方法。从而达到了输出有顺序的目的。
这里写图片描述

====
官方文档:
1.该类提供了一个特殊的构造方法,既可以构造一个输出顺序负荷LRU原则的LinkedHashMap.
何为LRU,就是最近最少使用,打个比方,我们插入值A、B、C、D,如果这样插入的话,那输出的时候就是A、B、C、D,看起来好像跟第一种没什么分别。那我们在测试,取数据A、B、C、D、A,我们在输出的时候,发现输出变成了B、C、D、A。A为什么跑到后边去了?这是因为,A被使用了2次,而LRU是最近最少使用,所以按照最近被使用的顺序,A被放在最后。
2.允许null值,在理想情况下,add、remove、contains方法的时间复杂度都是常数级别(like HashMap)
3.Map m = Collections.synchronizedMap(new LinkedHashMap(…)); //返回一个线程安全的,但是都是加悲观锁?

====
继承了HashMap中的Node结构,并加入了before和after两个变量

static class Entry<K,V> extends HashMap.Node<K,V> {
Entry<K,V> before, after;
Entry(int hash, K key, V value, Node<K,V> next) {
super(hash, key, value, next);
}
}

双向链表的头和尾

transient LinkedHashMap.Entry<K,V> head;
transient LinkedHashMap.Entry<K,V> tail;
final boolean accessOrder;// 是否要输出LRU的节点顺序

来看get()方法
可以看到如果启用了LRU,如果某节点e被get了一次,则立刻会放到链表的最后,跟被使用的次数无关。
http://flychao88.iteye.com/blog/1977653 缓存淘汰算法,有讲到跟使用频率有关的LRU)

public V get(Object key) {
Node<K,V> e;
if ((e = getNode(hash(key), key)) == null)
return null;
if (accessOrder) //如果输出顺是LRU,则调用下列方法
afterNodeAccess(e);
return e.value;
}
// 这个方法就是之前在分析HashMap时看到的预留给LinkedHashMap的方法
void afterNodeAccess(Node<K,V> e) { // move node to last
LinkedHashMap.Entry<K,V> last;
if (accessOrder && (last = tail) != e) {
LinkedHashMap.Entry<K,V> p =
(LinkedHashMap.Entry<K,V>)e, b = p.before, a = p.after;
p.after = null;
if (b == null)
head = a;
else
b.after = a;
if (a != null)
a.before = b;
else
last = b;
if (last == null)
head = p;
else {
p.before = last;
last.after = p;
}
tail = p;
++modCount;
}
}

LinkedHashMap中的put方法,和HashMap相同,只是LinkedMap会多执行一些方法来维护列表,一个就是上面的afterNodeaAccess,还有就是afterNodeInsertion

void afterNodeInsertion(boolean evict) { // possibly remove eldest,当evict为true时才执行
LinkedHashMap.Entry<K,V> first;
if (evict && (first = head) != null && removeEldestEntry(first)) { //但是意外地发现最后一个判别式始终返回false,所以这个方法并不会执行么?
K key = first.key;
removeNode(hash(key), key, null, false, true);
}
}

总之,可以将LinkedHashMap理解成一个带有链表功能的HashMap,结构和HashMap相同,只是各个节点之间按一定顺序相连,串成一个双向链表。

本站声明
本文转载自:http://blog.csdn.net/qqqqq1993qqqqq/article/details/72811910     作者:qqqqq1993qqqqq     发布日期:2017/05/30     本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。


猜您在找
 
© 2014-2018 ITdaan.com 粤ICP备14056181号