From a44d19e35ccdc848080c9ee326e302f0b932131e Mon Sep 17 00:00:00 2001 From: Guide Date: Mon, 28 Aug 2023 16:07:09 +0800 Subject: [PATCH] =?UTF-8?q?[docs=20fix]LinkedHashMap=E6=A0=91=E5=8C=96?= =?UTF-8?q?=E9=98=88=E5=80=BC=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/java/collection/linkedhashmap-source-code.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/java/collection/linkedhashmap-source-code.md b/docs/java/collection/linkedhashmap-source-code.md index de599f22..e805c85f 100644 --- a/docs/java/collection/linkedhashmap-source-code.md +++ b/docs/java/collection/linkedhashmap-source-code.md @@ -141,9 +141,15 @@ four 在正式讨论 `LinkedHashMap` 前,我们先来聊聊 `LinkedHashMap` 节点 `Entry` 的设计,我们都知道 `HashMap` 的 bucket 上的因为冲突转为链表的节点会在符合以下两个条件时会将链表转为红黑树: -1. 链表上的节点个数达到树化的阈值7,即`TREEIFY_THRESHOLD - 1`。 +1. ~~链表上的节点个数达到树化的阈值7,即`TREEIFY_THRESHOLD - 1`。~~ 2. bucket 的容量达到最小的树化容量即`MIN_TREEIFY_CAPACITY`。 +> **🐛 修正(参见:[issue#2147](https://github.com/Snailclimb/JavaGuide/issues/2147))**: +> +> 链表上的节点个数达到树化的阈值是 8 而非 7。因为源码的判断是从链表初始元素开始遍历,下标是从 0 开始的,所以判断条件设置为 8-1=7,其实是迭代到尾部元素时再判断整个链表长度大于等于 8 才进行树化操作。 +> +> ![](https://oss.javaguide.cn/github/javaguide/java/jvm/LinkedHashMap-putval-TREEIFY.png) + 而 `LinkedHashMap` 是在 `HashMap` 的基础上为 bucket 上的每一个节点建立一条双向链表,这就使得转为红黑树的树节点也需要具备双向链表节点的特性,即每一个树节点都需要拥有两个引用存储前驱节点和后继节点的地址,所以对于树节点类 `TreeNode` 的设计就是一个比较棘手的问题。 对此我们不妨来看看两者之间节点类的类图,可以看到: