| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> Java的HashMap原理总结(问答式学习) -> 正文阅读 |
|
[数据结构与算法]Java的HashMap原理总结(问答式学习) |
HashMap原理详解,包括面试会问到的一些问题的总结。 Java重要知识点总结如下:
文章目录1. 介绍下 HashMap 的底层数据结构我们现在用的都是 JDK 1.8,底层是由 数组+链表+红黑树 组成,如下图,而在 JDK 1.8 之前是由 数组+链表 组成。 1.1 为什么要改成 数组+链表+红黑树?主要是为了 1.2 什么时候用链表?什么时候用红黑树?
1.3 为什么链表转红黑树的阈值是8?在进行方案设计时,必须考虑的两个很重要的因素是:
1.4 为什么转回链表节点是用的6而不是复用8?如果我们设置节点多于8个转红黑树,少于8个就马上转链表,当节点个数在8徘徊时,就会 2. 讲一下 HashMap 的重要属性2.1 HashMap 有哪些重要属性?分别用于做什么的?除了用来存储我们的节点 table 数组外,HashMap 还有以下几个重要属性:
2.2 threshold 除了用于存放扩容阈值还有其他作用吗?在我们新建 HashMap 对象时, 2.3 HashMap 的默认初始容量是多少?HashMap 的容量有什么限制吗?
2.4 2的N次方是怎么算的?代码解释一下。
先不看第一行
>>>(无符号右移):例如 a >>> b 指的是将 a 向右移动 b 指定的位数,右移后左边空出的位用零来填充,移出右边的位被丢弃。 这5个公式会通过最高位的1,拿到2个1、4个1、8个1、16个1、32个1。当然,有多少个1,取决于我们的入参有多大,但我们肯定的是经过这5个计算,得到的值是一个低位全是1的值,最后返回的时候 +1,则会得到1个比n 大的 2 的N次方。 这时再看开头的 cap - 1 就很简单了,这是为了处理 cap 本身就是 2 的N次方的情况。
2.5 HashMap 的容量必须是 2 的 N 次方,这是为什么?计算索引位置的公式为:(n - 1) & hash,当 n 为 2 的 N 次方时,n - 1 为低位全是 1 的值,此时任何值跟 n - 1 进行 & 运算的结果为该值的低 N 位,达到了和取模同样的效果, 如下图, 2.6 HashMap 的默认初始容量是 16,为什么是16而不是其他的?16的原因主要是:16是2的N次方,并且是一个较合理的大小。如果用8或32,我觉得也是OK的。实际上,我们在新建 HashMap 时,最好是根据自己使用情况设置初始容量,这才是最合理的方案。 2.7 负载因子默认初始值为什么是0.75而不是其他的?也是在时间和空间上权衡的结果。如果值较高,例如1,此时会 3. HashMap 的插入(get)流程是怎么样的?
3.1 图里刚开始有个计算 key 的 hash 值,是怎么设计的?拿到 key 的 hashCode,并将 hashCode 的高16位和 hashCode 进行异或(XOR)运算,得到最终的 hash 值。
3.2 为什么要将 hashCode 的高16位参与运算?主要是为了在 table 的长度较小的时候,让高位也参与运算,并且不会有太大的开销。 4. HashMap 的扩容(resize)流程介绍下?4.1 红黑树和链表都是通过 e.hash & oldCap == 0 来定位在新表的索引位置,这是为什么?请看对下面的例子。 扩容前 table 的容量为16,a 节点和 b 节点在扩容前处于同一索引位置。 因为只取决于这一位,所以只会存在两种情况:
5. HashMap 的线程安全5.1 HashMap 是线程安全的吗?不是。 HashMap的线程不安全体现在会造成 总结:
5.2 介绍一下死循环问题?导致死循环的根本原因是 5.3 介绍一下数据覆盖问题?看一下下面这段JDK1.8中的put操作代码:
(1)第六行代码是判断是否出现hash碰撞
(2)38行处有个++size
6. 总结下 JDK 1.8 主要进行了哪些优化?JDK 1.8 的主要优化刚才我们都聊过了,主要有以下几点:
7. 除了 HashMap,还用过哪些 Map,在使用时怎么选择?参考: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 16:52:00- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |