HashMap集合源码以及底层结构解析(何时数组+单项链表变为数组+红黑二叉树)
2018-03-17 00:20
483 查看
当开始创建集合时,调用构造器,此时会对加载因子初始化
当首次调用put方法添加元素时
*注意:这里的hash值不是原始值返回的,而是算出key的hash值后和0无符号右移16位后的值进行异或运算
*然后进入resize方法
到这里resize方法就对table进行了初始化,容量16,临界值12
在后面的添加过程中,可能会用到下面else里面的添加方法,这里就不细说了,可以简单看下,然后记住后面的小结部分内容好好体会
小结:首次添加元素时,初始化的三个参数分别为:临界值12(16*0.75),数组长度(文中的容量)16以及加载因子0.75。当添加的元素的hash值与之前的有重复时,会进行内容对比(equals),如果一样,则会覆盖之前的内容,不一样则会加到上个元素的后面。
情况一:当总共元素个数大于临界值时,会以2倍的数量对数组容量扩容。
情况二:当单个链表中的元素个数大于8时,会以2倍的数量对数组容量扩容(每增加1个就会扩容一次)。
注意:当1、数组容量达到64。2、单向链表的元素个数达到8个时,HashMap底层结构会由【数组+单向链表】变成【数组+红黑二叉树】
极限情况:当所有的元素hash值都相同,都放到了一个链表,当放到第9个时,容量变为32,当放入第10个时,容量变为64,当放到第11个时,底层结构开始发生变化
当首次调用put方法添加元素时
*注意:这里的hash值不是原始值返回的,而是算出key的hash值后和0无符号右移16位后的值进行异或运算
*然后进入resize方法
到这里resize方法就对table进行了初始化,容量16,临界值12
在后面的添加过程中,可能会用到下面else里面的添加方法,这里就不细说了,可以简单看下,然后记住后面的小结部分内容好好体会
小结:首次添加元素时,初始化的三个参数分别为:临界值12(16*0.75),数组长度(文中的容量)16以及加载因子0.75。当添加的元素的hash值与之前的有重复时,会进行内容对比(equals),如果一样,则会覆盖之前的内容,不一样则会加到上个元素的后面。
情况一:当总共元素个数大于临界值时,会以2倍的数量对数组容量扩容。
情况二:当单个链表中的元素个数大于8时,会以2倍的数量对数组容量扩容(每增加1个就会扩容一次)。
注意:当1、数组容量达到64。2、单向链表的元素个数达到8个时,HashMap底层结构会由【数组+单向链表】变成【数组+红黑二叉树】
极限情况:当所有的元素hash值都相同,都放到了一个链表,当放到第9个时,容量变为32,当放入第10个时,容量变为64,当放到第11个时,底层结构开始发生变化
相关文章推荐
- ArrayList集合底层源代码展示以及结构解析,扩容机制
- Java集合,HashMap底层实现和原理(1.7数组+链表与1.8+的数组+链表+红黑树)
- Java泛型底层源码解析-ArrayList,LinkedList,HashSet和HashMap
- 源码解析-集合-HashMap
- 数组链表hashmap底层
- 107-109_容器_自己实现HashMap_Map底层实现_哈希算法实现_使用数组和链表
- 二叉树的二叉链表存储结构构建以及先序遍历
- Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例
- Java 集合系列10之 HashMap源码解析
- Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例
- 【java集合】HashMap源码解析
- 数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现
- [置顶] Java集合之HashMap源码解析
- List接口实现类-ArrayList、Vector、LinkedList集合深入学习以及源码解析
- Java 集合系列之 HashMap详细介绍(源码解析)和使用示例
- 牛客网Java刷题知识点之数组、链表、哈希表、 红黑二叉树
- 【集合源码】HashMap源码解析(基于JDK 1.8)
- 安卓使用Gson解析服务器返回Json数组,以及java服务器怎样返回list集合的Json数据(原创)
- 数据结构与实现——数组、矩阵、链表、队列、栈、对象、二叉树和红黑树
- HashMap、LinkedHash以及TreeMap源码解析