LinkedHashMap

LinkedHashMap

定义

1
2
3
4
5
public class LinkedHashMap<K,V>

extends HashMap<K,V>

implements Map<K,V>

继承于HashMap,底层使用哈希表与双向链表来保存所有元素。其基本操作与父类HashMap相似,它通过重写父类相关的方法,来实现自己的链接列表特性(维护一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序通常就是将键插入到映射中的顺序(插入顺序)))

核心方法介绍

init

1
2
3
4
5
6
7
8
9
void init() {

header = new Entry<>(-1, null, null, null);

//双向指针处理

header.before = header.after = header;

}

构造方法

1
2
3
4
5
6
7
public LinkedHashMap(int initialCapacity,float loadFactor,boolean accessOrder) {

super(initialCapacity, loadFactor);

this.accessOrder = accessOrder;

}

这种迭代访问顺序,适合构建LRU(Least Recently Used)缓存。LinkedHashMap在添加方法中使用了removeEldestEntry方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void addEntry(int hash, K key, V value, int bucketIndex) {

super.addEntry(hash, key, value, bucketIndex);

// Remove eldest entry if instructed

Entry<K,V> eldest = header.after;

if (removeEldestEntry(eldest)) {

removeEntryForKey(eldest.key);

}

}

默认返回false,即不进行近期访问最少处理元素,进行删除处理。

1
2
3
4
5
 protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {

return false;

}

如果想实现LRU缓存,则需要重写removeEldestEntry方法,如维持大小我为100的集合:

1
2
3
4
5
6
7
private static final int MAX_ENTRIES = 100;

protected boolean removeEldestEntry(Map.Entry eldest) {

return size() > MAX_ENTRIES;

}

超过100,则继续删除最早的元素。

Alan Zhang wechat
欢迎您扫一扫上面的微信公众号“补愚者说”,订阅我的博客!