java基础(三)hashMap底层原理

戏子无情 提交于 2020-03-08 17:29:59

HashMap底层原理

hashMap底层原理主要是jdk1.7和1.8以上的区别。
jdk1.7中底层是由数组(也有叫做“位桶”的)+链表实现;jdk1.8中底层是由数组+链表/红黑树实现。
参考学习:

https://blog.csdn.net/jswd_50x/article/details/86542240

HashMap面试题

1.谈一下HashMap的特性?

在这里插入图片描述

2.谈一下HashMap的底层原理是什么?
在这里插入图片描述

3.谈一下hashMap中put是如何实现的?
在这里插入图片描述

4.谈一下hashMap中什么时候需要进行扩容,扩容resize()又是如何实现的?
在这里插入图片描述
在这里插入图片描述

5.谈一下hashMap中get是如何实现的?
在这里插入图片描述

6.谈一下HashMap中hash函数是怎么实现的?还有哪些hash函数的实现方式?
在这里插入图片描述

7.为什么不直接将key作为哈希值而是与高16位做异或运算?
在这里插入图片描述

8.为什么是16?为什么必须是2的幂?如果输入值不是2的幂比如10会怎么样?

https://blog.csdn.net/sidihuo/article/details/78489820
https://blog.csdn.net/eaphyy/article/details/84386313

在这里插入图片描述
9.谈一下当两个对象的hashCode相等时会怎么样?
在这里插入图片描述
10.如果两个键的hashcode相同,你如何获取值对象?
HashCode相同,通过equals比较内容获取值对象

11."如果HashMap的大小超过了负载因子(load factor)定义的容量,怎么办?

在这里插入图片描述

12.HashMap和HashTable的区别
在这里插入图片描述

13.请解释一下HashMap的参数loadFactor,它的作用是什么?
在这里插入图片描述
14.传统hashMap的缺点(为什么引入红黑树?):
JDK 1.8 以前 HashMap 的实现是 数组+链表,即使哈希函数取得再好,也很难达到元素百分百均匀分布。当大量的元素都存放到同一个 HashMap 中有桶中时,这个桶下有一条长长的链表,这个时候 HashMap 就相当于一个单链表,假如单链表有 n 个元素,遍历的时间复杂度就是 O(n),完全失去了它的优势。针对这种情况,JDK 1.8 中引入了 红黑树(查找时间复杂度为 O(logn))来优化这个问题。

15. 平时在使用HashMap时一般使用什么类型的元素作为Key?
选择Integer,String这种不可变的类型,像对String的一切操作都是新建一个String对象,对新的对象进行拼接分割等,这些类已经很规范的覆写了hashCode()以及equals()方法。作为不可变类天生是线程安全的,
16.JDK7和JDK8的区别

1.JDK8中链表会转为红黑树
2.新节点插入链表的顺序不同(JDK7是插入头结点,JDK8因为要遍历链表把链表变为红黑树所以采用插入尾节点)
3.hash算法简化。
4.resize的逻辑修改(JDK7会出现死循环,JDK8不会)
死锁场景:https://blog.csdn.net/qq_36071795/article/details/83655029
弄懂死锁:https://blog.csdn.net/weixin_34041003/article/details/87986378?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!