LinkedHashMap.md 修缮部分内容

pull/56/head
AmyliaY 5 years ago
parent 60ac0fc12d
commit 11eaca0447

@ -1,9 +1,9 @@
HashMap 大家都清楚,底层是 数组 + (红黑树 / 链表)**元素是无序的**,而 LinkedHashMap 则比 HashMap 多了这一个功能并且LinkedHashMap 的有序可以按两种顺序排列一种是按照插入的顺序一种是按照访问的顺序初始化LinkedHashMap对象时设置accessOrder参数为true而其内部是靠 建立一个双向链表 来维护这个顺序的,在每次插入、删除后,都会调用一个函数来进行 双向链表的维护,这也是实现 LRU Cache 功能的基础。
HashMap 大家都清楚,底层是 数组 + (链表 / 红黑树)**元素是无序的**,而 LinkedHashMap 则比 HashMap 多了这一个功能并且LinkedHashMap 的有序可以按两种顺序排列一种是按照插入的顺序一种是按照访问的顺序初始化LinkedHashMap对象时设置accessOrder参数为true而其内部是靠 建立一个双向链表 来维护这个顺序的,在每次插入、删除后,都会调用一个函数来进行 双向链表的维护,这也是实现 LRU Cache 功能的基础。
先说几个比较重要的结论,大家可以根据这些结论从后面的源码解析中 得到证据。
1. LinkedHashMap 继承了 HashMap所以和 HashMap 的底层数据结构是一样的,都是数组+链表+红黑树,扩容机制也一样;
2. LinkedHashMap 通过双向链表来维护数据的顺序
3. LinkedHashMap 存储顺序与添加顺序默认是一样得,同时可以根据 accessOrder参数 来决定是否在访问时移动元素,以实现 LRU 功能。
2. LinkedHashMap 是通过双向链表来维护数据的,与 HashMap 的拉链式存储不一样
3. LinkedHashMap 存储顺序与添加顺序是一样得,同时可以根据 accessOrder参数 来决定是否在访问时移动元素,以实现 LRU 功能。
```java
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> {
@ -97,7 +97,7 @@ public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> {
return t;
}
// 在删除元素之后,将元素从双向链表中删除
// 在删除元素之后,将元素从双向链表中删除
void afterNodeRemoval(Node<K,V> e) { // unlink
LinkedHashMap.Entry<K,V> p =
(LinkedHashMap.Entry<K,V>)e, b = p.before, a = p.after;
@ -112,7 +112,7 @@ public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> {
a.before = b;
}
// 可用于删除最老的元素
// 可用于删除最老的元素
void afterNodeInsertion(boolean evict) { // possibly remove eldest
LinkedHashMap.Entry<K,V> first;
if (evict && (first = head) != null && removeEldestEntry(first)) {
@ -120,8 +120,12 @@ public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> {
removeNode(hash(key), key, null, false, true);
}
}
// 是否删除 最近最少使用的元素
protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
return false;
}
// 在访问元素之后,将该元素放到双向链表的尾巴处
// 在访问元素之后,将该元素放到双向链表的尾巴处
void afterNodeAccess(Node<K,V> e) { // move node to last
LinkedHashMap.Entry<K,V> last;
if (accessOrder && (last = tail) != e) {
@ -215,7 +219,7 @@ public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> {
}
/**
* {@inheritDoc}
* 根据 key 获取对应的 value如果key不存在则返回给定的默认值 defaultValue
*/
public V getOrDefault(Object key, V defaultValue) {
Node<K,V> e;
@ -224,7 +228,7 @@ public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> {
if (accessOrder)
afterNodeAccess(e);
return e.value;
}
}
/**
* {@inheritDoc}

Loading…
Cancel
Save