网上资料太丑,漫无目的没有针对性,学生不知道如何提炼重点。本人以面试官角度整理hashmap原理,以达到“目的性”学习
1.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专题】
閱讀更多 java進階架構師 的文章