Java容器之HashMap源码解析(视频讲解)
内容简介:讲解HashMap的底层数据结果、处理逻辑和源码实现。首先通过画图模拟HashMap的数据结果和底层处理逻辑;然后解析put和get方法,印证模拟中的原理;通过解读源码,讲解单向链表转换成红黑树的条件,以及何时又从红黑树转换回单向链表;最后分析initialCapacity和loadFactor在HashMap中的作用,以及他们对性能的影响。
视频地址:https://mp.weixin.qq.com/s/8z4jdDkDcwlTQi13UNsQCQ
内容补充:(由于视频时长的原因,下面做几点补充)
默认的初始capacity是2的4次方,即16。
如果设置的初始capacity不是2的n次方,底层会使用tableSizeFor方法将其设置为大于设置值的第一个2的n次方值。比如设置的初始capacity为10,实际上会使用16作为最终的初始capacity(为什么必须是2的n次方视频中有解释)。初始capacity会影响resize()的频率,因此如果要调优,应结合map中初始的条目数量和每次增加的数量总和考虑。但不应设置的过大,这个原因视频中有讲到。
我在视频中说了一个“重hash”的概念,我对其的定义是在原有的hashCode上再进行一次hash处理。如果大家看一些国外的文章,可能会看到“rehashing”的概念,这个概念指的是在resize()的时候,对原有的数据进行数组下标的重新分配。这两个概念是不同的。
这里重点强调一下,网上很多帖子说当列表长度大于8时(包含数组上的那个元素,总共是8个),链表就会转换成红黑树,这种说法不完整,为什么不完整,请注意视频中的相关讲解。
为什么长度大于8就有可能转红黑树。转红黑树的目的是为了优化查找速度,但红黑树的空间占用比链表大,因此这是一个空间和时间的权衡。为什么是8,这个原因在源码的一段注释中进行了解释。在给定时间或空间的前提下,不同key计算出相同数组下标的概率符合“泊松分布”,注释中给出一个得算,当loadFactor为0.75,且条目数大约占总容量的0.5倍时,对一个index而言,有0个key落在上面的可能性是0.6左右,1个的可能性是0.3左右,8个的时候为0.00000006,超过8个的概率就已经小于千万分之一了。因此当阈值为8时,除非你的HashMap存了大量的条目(个人估算至少百万级),出现红黑树的概率是很低的。这样就在时间和空间上取得一个比较好的权衡。
更多视频讲解请关注我的公众号:
Java容器之HashMap源码解析(视频讲解)相关推荐
- Java集合系列---HashMap源码解析(超详细)
1 HashMap 1)特性: 底层数据结构是数组+链表+红黑树运行null键和null值,,非线程安全,不保证有序,插入和读取顺序不保证一致,不保证有序,在扩容时,元素的顺序会被重新打乱 实现原理: ...
- Java集合框架之三:HashMap源码解析
Java集合框架之三:HashMap源码解析 版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! HashMap在我们的工作中应用的非常广泛,在工作面试中也经常会被问到,对于这样一个重要的集 ...
- 面试官系统精讲Java源码及大厂真题 - 08 HashMap 源码解析
08 HashMap 源码解析 自信和希望是青年的特权. --大仲马 引导语 HashMap 源码很长,面试的问题也非常多,但这些面试问题,基本都是从源码中衍生出来的,所以我们只需要弄清楚其底层实现原 ...
- HashMap源码解析(JDK1.8)
HashMap源码解析(JDK1.8) 目录 定义 构造函数 数据结构 存储实现源码分析 删除操作源码分析 hashMap遍历和异常解析 1. 定义 HashMap实现了Map接口,继承Abstrac ...
- hashmap删除指定key_Java集合之HashMap源码解析(JDK8)
哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景非常丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常出 ...
- 红黑树分析与JDK8中HashMap源码解析
红黑树分析与JDK8中HashMap源码解析 BST O(1), O(n), O(logn), O(nlogn) 的区别 红黑树-RBTree 插入数据 HashMap中红黑树的插入操作 HashMa ...
- Java HashSet和HashMap源码剖析
转载自 Java HashSet和HashMap源码剖析 总体介绍 之所以把HashSet和HashMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也就是说Ha ...
- Java集合之TreeMap源码解析上篇
上期回顾 上期我从树型结构谈到了红黑树的概念以及自平衡的各种变化(指路上期←戳),本期我将会对TreeMap结合红黑树理论进行解读. 首先,我们先来回忆一下红黑树的5条基本规则. 1.结点是红色或者黑 ...
- 通俗易懂Hashmap源码解析
Hashmap源码解析 一.Hashmap数据结构 哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的值即 key,就可以找到其对应的值即 Value.哈希的思路很简单 ...
最新文章
- Python 3/前端 画图工具:Matplotlib,canvajs,pyecharts
- python详细安装教程环境配置-如何安装Python(环境设置)?详细安装步骤图解
- linux mount挂载设备(u盘,光盘,iso等 )使用说明
- linux 测试vim编译器_软件测试工程师必须要掌握的linux命令
- Registry注册机制
- 拼夕夕订单超时未支付自动关闭实现方案!
- 数据可视化demo_火出圈的大屏你真的会做吗?这才是老板最爱的可视化大屏
- scrapy item.py
- 初识JS-基础中的基础
- Android Studio如何查找和替换
- kinect相机标定参考教程
- React项目中第三方使用微信扫码登录
- 浅入浅出Vivado IP之DDS Compiler
- 计算机一级ps教程自学网,ps教程自学网
- 京津冀辽迎入汛以来最强降雨,四川盆地西部形成暴雨结界
- Tita 绩效宝:掌握绩效考核对话
- 【HTML】使用Vscode快速书写HTML
- 考HCIE大概需要多少钱?
- 浙工大c语言期中考试试题答案,浙工大c语言程序设计期末试卷2
- LaTeX 002:d 上带一横(d with stroke、dbar、đ)兼容 XeLaTeX 和 MathJax 的折中办法