hashMap源码分析1.8
HashMap
- JDK1.8的HashMap:底层实现(数组+链表/红黑树)
- 1、为什么要从JDK1.8之前的链表设计,修改为链表或红黑树的设计?
- 当某个链表比较长的时候,查找效率还是会降低。
- 为了提高查询效率,那么把table[index]下面的链表做调整。
- 如果table[index]的链表的节点的个数比较少,(8个或以内),就保持链表。如果超过8个,那么就要考虑把链表转为一棵红黑树。
- TREEIFY_THRESHOLD:树化阈值,从链表转为红黑树的临界值。
- 2、什么时候树化?
- table[index]下的结点数一达到8个就树化吗?
- 如果table[index]的节点数量已经达到8个了,还要判断table.length是否达到64,如果没有达到64,先扩容。
- 演示:8个->9个 length从16-》32
9个->10个 length从32->64
10个->11个 length已经达到64,table[index]就从Node类型转为TreeNode类型,说明树化
- MIN_TREEIFY_CAPACITY:最小树化容量64
- 3、什么时候从树–>链表
- 当你删除结点时,这棵树的结点个数少于6个,会反树化,变为链表
- UNTREEIFY_THRESHOLD:6个
- 树的结构太复杂,当结点少了之后,就用链表更好。
- 4、put的过程
- (1)[index]的计算问题
- 第一步用key的hashCode值调用hash()函数,干扰hash值,使得(key,value)更加均匀的分布table数组中。
- JDK1.8中hash()算法更优化。
- 第二步: hash值与table.length-1做&运算,保证index在[0,length-1]范围内
- (2)扩容问题
- 第一种:当某个table[index]的链表的个数达到8个,并且table.length<64,那么会扩容
- 第二种:size >= threshold,并且table[index]!=null
- threshold = table.length * loadFator(它的默认值DEFAULT_LOAD_FACTOR:0.75)
- (3)当把(key,value)添加到链表中,JDK1.8是在链表的尾部
hashMap源码分析1.8相关推荐
- Java类集框架 —— HashMap源码分析
HashMap是基于Map的键值对映射表,底层是通过数组.链表.红黑树(JDK1.8加入)来实现的. HashMap结构 HashMap中存储元素,是将key和value封装成了一个Node,先以一个 ...
- 查询已有链表的hashmap_源码分析系列1:HashMap源码分析(基于JDK1.8)
1.HashMap的底层实现图示 如上图所示: HashMap底层是由 数组+(链表)=(红黑树) 组成,每个存储在HashMap中的键值对都存放在一个Node节点之中,其中包含了Key-Value ...
- 源码分析系列1:HashMap源码分析(基于JDK1.8)
1.HashMap的底层实现图示 如上图所示: HashMap底层是由 数组+(链表)+(红黑树) 组成,每个存储在HashMap中的键值对都存放在一个Node节点之中,其中包含了Key-Value ...
- HashMap源码分析(转载)
一.HashMap概述 HashMap基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了不同步和允许使用 null 之外,HashMap ...
- Map接口总结与HashMap源码分析
Map接口 1.Map,用于保存K-V(双列元素) 2.Map中的Key Value可以是任意引用分类型的数据,会封装到HashMap的Node对象中 3.Map的key不允许重复.原因和HashSe ...
- 在参考了众多博客之后,我写出了多达三万字的HashMap源码分析,比我本科毕业论文都要精彩
HashMap源码分析 以下代码都是基于java8的版本 HashMap简介 源码: public class HashMap<K,V> extends AbstractMap<K, ...
- hashmap源码分析及常用方法测试_一点课堂(多岸学院)
HashMap 简介 底层数据结构分析 JDK1.8之前 JDK1.8之后 HashMap源码分析 构造方法 put方法 get方法 resize方法 HashMap常用方法测试 感谢 changfu ...
- HashMap 源码分析与常见面试题
文章目录 HashMap 源码分析 jdk 1.7 内部常量 静态内部类 Holder 类 构造方法 put 过程 put 整体流程图 jdk 1.8 增加的常量 Node 类 Hash 值计算的变化 ...
- HashMap源码分析
文章目录 简介 继承关系 存储结构 源码分析 属性 Node节点 TreeNode HashMap 构造方法 put 添加方法 待更新 简介 在我们使用数据存储的时候都会有数据结构这种东西,但是传统的 ...
- JDK7中HashMap源码分析
文章目录 JDK7中的HashMap 一.JDK7中HashMap源码中重要的参数 二.JDK7中HashMap的构造方法 三.JDK7中创建一个HashMap的步骤 四.JDK7中HashMap的p ...
最新文章
- mysql mrr_cost_based_mysql mrr介绍
- Yii的scenarios
- swift学习笔记-----swift中的指针
- python实现Redis订阅发布
- problem b: 一年中的第几天_第九届蓝桥杯B组试题
- Docker由浅入深
- 自动化测试工具selenium python_WEB自动化测试工具selenium录制器
- SSOR-PCG FORTRAN版CSR压缩存储
- ios控制中心android版,IOS控制中心
- 人力资源SaaS“一哥”,二十年艰难进化
- android 打开pdf文件
- 阅读笔记:Poison Over Troubled Forwarders: A Cache Poisoning Attack Targeting DNS Forwarding Devices
- 使用Mybatis进行更新操作成功,数据库却没更新的原因
- 解码方法( dfs | dp )
- 深入理解Java虚拟机(周志明第三版)- 第十一章:后端编译与优化
- c 语言字符串查找替换,c ++ - 如何在标准字符串中搜索/查找和替换?
- mysql gis_MySQL的GIS、GEO入门笔记
- 图解机器学习算法(6) | 决策树模型详解(机器学习通关指南·完结)
- 【数据结构与算法】-6.1图的基本概念和术语
- iqooneo3 如何不用vivo账号下载外部应用_iQOO Neo3评测:救市或转型?总之香就对了...