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个,不树化,而是进行扩容。
- 插入第一个元素时,初始扩容;
- 当插入元素个数到达threshold扩容阈值时,扩容
- 当某个位置元素≥8个时,即单链长度≥8,且map容量小于64,扩容。
所以, 正确应该是 数组长度大于64,并且链表长度大于8 ,转化树。
HashMap的转化时机的更多相关文章
- jdk1.8源码解析:HashMap底层数据结构之链表转红黑树的具体时机
		本文从三个部分去探究HashMap的链表转红黑树的具体时机: 一.从HashMap中有关“链表转红黑树”阈值的声明: 二.[重点]解析HashMap.put(K key, V value)的源码: 三 ... 
- 重读源码,见证HashMap以及它的朋友们的骚操作
		一.Getting Start Again and again,until you master it.早在接触java.util包的时候,我们都会去阅读ArrayList,甚至也会去阅读HashMa ... 
- HashMap这些问题你知道吗?
		HashMap是Java面试中的常考点之一,而且其<Key,Value>结构也是开发中常常用到的结构之一.或许你使用过HashMap,但是你知道下面这些问题吗? HashMap的底层结构是 ... 
- HashMap的结构以及核心源码分析
		摘要 对于Java开发人员来说,能够熟练地掌握java的集合类是必须的,本节想要跟大家共同学习一下JDK1.8中HashMap的底层实现与源码分析.HashMap是开发中使用频率最高的用于映射(键值对 ... 
- 关于HashMap容量的初始化,还有这么多学问。
		在<HashMap中傻傻分不清楚的那些概念>文章中,我们介绍了HashMap中和容量相关的几个概念,简单介绍了一下HashMap的扩容机制. 文中我们提到,默认情况下HashMap的容量是 ... 
- 为啥HashMap的默认容量是16?
		集合是Java开发日常开发中经常会使用到的,而作为一种典型的K-V结构的数据结构,HashMap对于Java开发者一定不陌生. 在日常开发中,我们经常会像如下方式以下创建一个HashMap: Map& ... 
- 为啥HashMap的默认容量是16
		集合是Java开发日常开发中经常会使用到的,而作为一种典型的K-V结构的数据结构,HashMap对于Java开发者一定不陌生. 在日常开发中,我们经常会像如下方式以下创建一个HashMap: Map& ... 
- HashMap实现详解  基于JDK1.8
		HashMap实现详解 基于JDK1.8 1.数据结构 散列表:是一种根据关键码值(Key value)而直接进行访问的数据结构.采用链地址法处理冲突. HashMap采用Node<K,V> ... 
- HashMap初始化容量过程
		集合是Java开发日常开发中经常会使用到的,而作为一种典型的K-V结构的数据结构,HashMap对于Java开发者一定不陌生.在日常开发中,我们经常会像如下方式以下创建一个HashMap: Map&l ... 
随机推荐
- 【题解】poj 3162 Walking Race 树形dp
			题目描述 Walking RaceTime Limit: 10000MS Memory Limit: 131072KTotal Submissions: 4941 Accepted: 1252Case ... 
- Golang学习(用代码来学习) - 第四篇
			/** 一个用来进行go routine的函数 */ func print_something(msg string){ for i:= 0;i < 5;i++{ time.Sleep(1 * ... 
- R-聚类
			一.定义:将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类 二.距离:欧几里得度量(euclidean metric)也称欧氏距离 绝对值距离(manhattan) ... 
- 100、nginx_https安全链接配置
			100.1. tcp的三次握手和四次挥手的过程: 1.三次握手(建立连接): 第一次:建立连接时,客户端发送SYN包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次:服务器 ... 
- 在windows的情况下面右键添加vim
			1, 首先打开注册表,然后打开下面路径: HKEY_CLASSES_ROOT\*\Shell 2, 右键新建项(也就是右键的文字): 用vim编辑 3, 在"用vim编辑"下面再 ... 
- 尝试用面向对象思维理解Vue组件
			什么是组件 用面向对象的思维去理解Vue组件,可以将所有的事物都抽象为对象,而类或者说是组件,都具有属性和操作. 如抽取人类为组件,其基本的属性有姓名.年龄.国籍:基本的方法有吃饭.睡觉.跑步等. & ... 
- acwing 868. 筛质数
			线性筛 #include<bits/stdc++.h> #define N 1000010 using namespace std; int v[N],p[N]; void pr(int ... 
- 学会这些CSS技巧让你写样式更加丝滑
			目录 1,前言 1,calc() 2,min() 3,max() 4,clamp() 5,gap 6,writing-mode 1,前言 记录一些很好用的css属性 1,calc() calc()函数 ... 
- SpringBoot | 1.2 全注解下的Spring IoC
			前言 在学习SpringBoot之前,有几个Spring的重要的基础概念需要提一下,SpringBoot对这些基础概念做进一步的封装,完成自动配置.首先就是Spring的控制反转IOC,由于Sprin ... 
- Linux:Linux操作防火墙命令
			首先查看Linux的防火墙是否关闭 firewall-cmd Linux上新用的防火墙软件,跟iptables差不多的工具. firewall-cmd --state # 显示防火墙状态 system ... 
