透过问题看本质:从面试官角度学习hashmap原理及其必问八大问题

网上资料太丑,漫无目的没有针对性,学生不知道如何提炼重点。本人以面试官角度整理hashmap原理,以达到“目的性”学习

1.hashmap简介(如下,数组-链表形式)

HashMap的存储结构

透过问题看本质:从面试官角度学习hashmap原理及其必问八大问题

图中,紫色部分即代表哈希表,hashmap也称为哈希数组(默认数组大小是16,每对key-value键值对其实是存在map的内部类entry里的),数组的每个元素都是一个单链表的头节点,跟着的绿色链表是用来解决冲突的,如果不同的key映射到了数组的同一位置处,就将其放入单链表中

2.hashmap原理(即put和get原理)

2.1 put原理

1.根据key获取对应hasn值:int hash = hash(key.hash.hashcode())

2.根据hash值和数组长度确定对应数组引int i = indexFor(hash, table.length); 其实就是i = hash值%模以 数组长度。如果不同的key都映射到了数组的同一位置处,就将其放入单链表中

2.2 get原理

1.获得对应数组位置,遍历该数组所在链表(key.equals())

3.hashcode相同,冲突怎么办?

放到对应的链表。

4.hashmap达到默认负载因子(0.75)怎么办?

自动双倍扩容,扩容后重新计算每个键值对位置。

5. hashmap 和 hashtable 区别?

线程: 不安全 安全(synchronized修饰)

效率: 更高 略低

数组默认值: 16 11

null值: key-value都允许 不允许(抛异常)

其中key为null的map对象就在索引为0的位置上

6. hashmap 和 concurrenthashmap区别?

线程: 不安全 安全

7.为啥concurrenthashmap和hashtable都是线程安全,但是前者性能更高?

因为前者是用的分段锁,根据hash值锁住对应链表,当hash值不同时,使其能实现并行插入,效率更高

8.java7的hashmap和java8的hashmap的区别?

为了加快查询效率(因为get()需要遍历整张链表),而java8的hashmap引入了红黑树结构,当某一链表元素>8时,该链表就会转成红黑树结构,从而改善查询速度


已完结专题(关注后查看):

  • 【mysql优化专题】【HTTP协议】
  • 【架构技术专题】【多线程/池专题】

更新中专题(关注后查看):

  • 【dubbo专题】【dubbo源码专题】
  • 【JVM专题】【HTTP协议专题】
  • 【设计模式专题】【高并发专题】
  • 【架构技术专题】【netty专题】
  • 【数据结构专题】【redis专题】


分享到:


相關文章: