目录
目标
通过源码理解如何支持hashmap特性,链表的作用。
JDK版本
JDK8
个人认为的重点
如何支持HashMap特性
继承HashMap,所以数据存储仍然使用hashmap的结构。extends HashMap<K,V> implements Map<K,V>
Entry节点
继承hashmap的Node,增加了两个指针。所以虽然使用hashmap的结构存储,但是使用双向链表将所有节点连接在一起。
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);
}
}
连接Entry的时机
重写了newNode,afterxxx等方法,因此可以控制节点生成与读写操作的后续行为,主要时指针操作。
链表的用途
使用hashmap存储同时,需要知道节点的插入顺序
用于LRU淘汰策略的cache
- 设置accessOrder = true
默认false,元素根据插入顺序进行连接;
设置true,元素按照迭代访问顺序进行连接;
- 定义子类,重写removeEldestEntry方法,移除最年长的节点
private static final int MAX_ENTRIES = 100;
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() & MAX_ENTRIES;
}
- LRU策略
新插入节点,放在tail;
访问的节点,移动到tail;
删除head节点;