Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion docs/java/collection/linkedhashmap-source-code.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ LRUCache < Integer, String > cache = new LRUCache < > (2);
cache.put(1, "one");
cache.put(2, "two");
cache.put(3, "three");
cache.put(4, "four");
for (int i = 0; i < 4; i++) {
System.out.println(cache.get(i));
}
Expand All @@ -129,6 +130,7 @@ for (int i = 0; i < 4; i++) {
null
null
three
four
```

从输出结果来看,由于缓存容量为 2 ,因此,添加第 3 个元素时,第 1 个元素会被删除。添加第 4 个元素时,第 2 个元素会被删除。
Expand All @@ -139,7 +141,7 @@ three

在正式讨论 `LinkedHashMap` 前,我们先来聊聊 `LinkedHashMap` 节点 `Entry` 的设计,我们都知道 `HashMap` 的 bucket 上的因为冲突转为链表的节点会在符合以下两个条件时会将链表转为红黑树:

1. 链表上的节点个数达到树化的阈值-1,即`TREEIFY_THRESHOLD - 1`。
1. 链表上的节点个数达到树化的阈值7,即`TREEIFY_THRESHOLD - 1`。
2. bucket 的容量达到最小的树化容量即`MIN_TREEIFY_CAPACITY`。

而 `LinkedHashMap` 是在 `HashMap` 的基础上为 bucket 上的每一个节点建立一条双向链表,这就使得转为红黑树的树节点也需要具备双向链表节点的特性,即每一个树节点都需要拥有两个引用存储前驱节点和后继节点的地址,所以对于树节点类 `TreeNode` 的设计就是一个比较棘手的问题。
Expand Down