JDK1.8 HashMap(1)

序言

触摸本质才能永垂不朽

为什么面试都喜欢问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

资料

Java小白的源码学习系列:HashMap

HashMap 源码详细解析 (JDK1.8)

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

Java集合 HashSet的原理及常用方法

https://www.cnblogs.com/idea360/p/12424939.html

原文地址:https://www.cnblogs.com/cnki/p/10343873.html