JavaGuide icon indicating copy to clipboard operation
JavaGuide copied to clipboard

2.2.8 小节对HashMap树化的描述有一点问题

Open XuyiK opened this issue 5 years ago • 3 comments

作者在 JDK1.8之后 这一小节的开头中写道:

JDK1.8之后再解决哈希冲突问题时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间

这段话加粗部分的描述是不准确的,当链表长度大于阈值时,会尝试调用树化方法treeifyBin,但这不意味着会将链表转为树:

微信截图_20200418102018

当我们查看树化方法treeifyBin(JDK1.8 HashMap源码)时,应注意到这么一行代码(757行):

微信截图_20200418102319

我们发现,当哈希表的length小于MIN_TREEIFY_CAPACITY (默认为64)时,并不会真正树化,而只是执行resize(),也就是扩容的操作,这一点在对树化方法treeifyBin以及MIN_TREEIFY_CAPACITY 的注释中都有提到:

微信截图_20200418102713

微信截图_20200418102733

如果我的看法有什么错漏之处,恳请大家补充指正

XuyiK avatar Apr 18 '20 02:04 XuyiK

😊是的,你说的没错。当链表的长度超过了默认阈值8的时候并不是立马就树形化,在treeifyBin(Node<K,V>[] tab, int hash)方法里面还要判断下 table 的 length 是否大于64,小于64是直接resize的。

debugjoker avatar Apr 25 '20 23:04 debugjoker

我也觉得是这样的,小于64是resize扩容,至少大于等于64才会去做链转树操作。

shahainloong avatar Nov 01 '20 09:11 shahainloong

作者在 JDK1.8之后 这一小节的开头中写道:

JDK1.8之后再解决哈希冲突问题时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间

这段话加粗部分的描述是不准确的,当链表长度大于阈值时,会尝试调用树化方法treeifyBin,但这不意味着会将链表转为树:

微信截图_20200418102018

当我们查看树化方法treeifyBin(JDK1.8 HashMap源码)时,应注意到这么一行代码(757行):

微信截图_20200418102319

我们发现,当哈希表的length小于MIN_TREEIFY_CAPACITY (默认为64)时,并不会真正树化,而只是执行resize(),也就是扩容的操作,这一点在对树化方法treeifyBin以及MIN_TREEIFY_CAPACITY 的注释中都有提到:

微信截图_20200418102713

微信截图_20200418102733

如果我的看法有什么错漏之处,恳请大家补充指正

非常👍 简单修改完善了一下: image

Snailclimb avatar Feb 25 '21 07:02 Snailclimb