HashMap的转化时机

HashMap的转化时机

	/**
    * 使用红黑树(而不是链表)来存放元素。当向至少具有这么多节点的链表再添加元素时,链表就将转换为红黑树。
    * 该值必须大于2,并且应该至少为8,以便于删除红黑树时转回链表。
    */
    static final int TREEIFY_THRESHOLD = 8;
    /**
     *  当桶数组容量小于该值时,优先进行扩容,而不是树化:
     */
    static final int MIN_TREEIFY_CAPACITY = 64;

putval片段

…………

else { //下面的代码是探究“链表转红黑树”的重点:
	for (int binCount = 0;; ++binCount) {
		if ((e = p.next) == null) { 
            //沿着p节点,找到该桶上的最后一个节点:
			p.next = newNode(hash, key, value, null); //直接生成新节点,链在最后一个节点的后面;
            //“binCount >= 7”:p从链表.index(0)开始,
            //当binCount == 7时,p.index == 7,newNode.index == 8; 
            //也就是说,当链表已经有8个节点了
            //此时再新链上第9个节点,在成功添加了这个新节点之后,立马做链表转红黑树。
            	if (binCount >= TREEIFY_THRESHOLD - 1)
          	treeifyBin(tab, hash); 
            //链表转红黑树 break;             
        }            
………… 

如果你的table总容量小于64就不给你树化了,哪怕你一个单链的元素个数超过了8个,不树化,而是进行扩容。

  1. 插入第一个元素时,初始扩容;
  2. 当插入元素个数到达threshold扩容阈值时,扩容
  3. 当某个位置元素≥8个时,即单链长度≥8,且map容量小于64,扩容。

所以, 正确应该是 数组长度大于64,并且链表长度大于8 ,转化树。

posted @   Ricardo_ML  阅读(74)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
点击右上角即可分享
微信分享提示