序言
触摸本质才能永垂不朽
为什么面试都喜欢问HashMap
HashMap(无序、线程不安全)作为一个键值对(key-value)的常见集合,在整个java的使用过程中都起着举足轻重的作用。
HashMap数据结构
HashMap底层是基于散列算法实现,散列算法分为散列再探测和拉链式。
HashMap则使用了拉链式的散列算法,并在JDK 1.8中引入了红黑树优化过长的链表。利用红黑树快速增删改查的特点提高HashMap的性能。
JDK版本 | 实现方式 | 节点数>=8 | 节点数<=6 |
---|---|---|---|
1.8以前 | 数组+单向链表 | 数组+单向链表 | 数组+单向链表 |
1.8以后 | 数组+单向链表+红黑树 | 数组+红黑树 | 数组+单向链表 |
jdk1.7数据存储结构(采用数组+链表)
Jdk1.8数据存储结构(采用数组+链表+红黑树)
注意:在链表长度大于8后,查询复杂度由O(n)变为O(logn),将链表存储转换成红黑树存储(也就是TreeMap)
红黑树R-B Tree简介(本质其实是2-3-4树):
HashMap常见面试题
-
HashMap的底层数据结构?
-
HashMap的存取原理?
-
Java7和Java8的区别?
-
为啥会线程不安全?
-
有什么线程安全的类代替么?
-
默认初始化大小是多少?为啥是这么多?为啥大小都是2的幂?
-
HashMap的扩容方式?负载因子是多少?为什是这么多?
-
HashMap的主要参数都有哪些?
-
HashMap是怎么处理hash碰撞的?
-
hash的计算规则?
- 怎么解决hash碰撞,1.7中hashmap实现和1.8实现有何区别,hashmap中,为何链表达到一定大小红要转为红黑树
- 为什么HashMap的数组长度要取2的整数幂
https://blog.csdn.net/qq_40574571/article/details/97612100
资料
https://www.cnblogs.com/chengxiao/p/6059914.html
https://www.cnblogs.com/sanzao/p/10371789.html
https://www.cnblogs.com/Krloypower/p/10675686.html
https://www.cnblogs.com/baixianlong/p/10703558.html