一、散列表结构
散列表结构就是数组+链表的结构
本文分享给需要面试刷题的朋友,我特意整理了一下,里面的技术不是靠几句话就能讲清楚,多问题其实答案很简单,但是背后的思考和逻辑不简单,要做到知其然还要知其所以然。如果想学习Java工程化、高性能及分布式、深入浅出。性能调优、Spring,MyBatis,Netty源码,数据结构,jvm,多线程等等,由于篇幅有限,以下只展示小部分面试题,有需要完整版的朋友可以点一点链接跳转领取,链接:戳这里免费下载,获取码:掘金
二、什么是哈希?
Hash也称散列、哈希,对应的英文单词Hash,基本原理就是把任意长度的输入,通过Hash算法变成固定长度的输出
这个映射的规则就是对应的哈希算法,而原始数据映射后的二进制就是哈希值
不同的数据它对应的哈希码值是不一样的
哈希算法的效率非常高
三、HashMap原理讲解
3.1继承体系图
3.2Node数据结构分析
1 | java复制代码static class Node<K,V> implements Map.Entry<K,V> { |
3.3底层存储结构
当链表长度到达8时,升级成红黑树结构
3.4put数据原理分析
首先put进去一个key—-value
根据key值会计算出一个hash值
经过扰动使数据更散列
构造出一个node对象
最后在通过路由算法得出一个对应的index
3.5什么是哈希碰撞?
当传入的数据key对应计算出的hash值的后四位和上一个一样时,这时候计算出的index就会一致,就会发生碰撞,导致数据变成链表
- 例如:
(16-1)——->0000 0000 0000 1111
“张三”——->0100 1101 0001 1011
“李四”——–>1011 1010 0010 1011
此时,就会发现,张三和李四计算出的hash值转化为二进制的后四位一致,导致计算出index一致
3.6JDK8为什么引入红黑树?
哈希碰撞,会带来链化,效率会变低
引入红黑树会提高查找效率
3.7扩容机制
每次扩容为初始容量的2倍
eg:16——->32
为了防止数据过多,导致线性查询,效率变低,扩容使得桶数变多,每条链上数据变少,查询更快
四、手撕源码
1.HashMap核心属性分析
树化阈值—–8和64
负载因子0.75
threshold扩容阈值,当哈希表中的元素超过阈值时,触发扩容
loadFactory负载因子0.75,去计算阈值 eg:16*0.75
size——-当前哈希表中元素个数
modCount——–当前哈希表结构修改次数
2.构造方法分析
1 | java复制代码public HashMap(int initialCapacity, float loadFactor) { |
3.put方法分析
1 | java复制代码public V put(K key, V value) { |
4.resize()方法分析
1 | java复制代码//为了解决哈希冲突,影响哈希效率,所以会有扩容机制 |
5.get方法
1 | java复制代码public V get(Object key) { |
6.remove方法分析
1 | java复制代码public V remove(Object key) { |
7.replace方法分析
1 | java复制代码@Override |
本文分享给需要面试刷题的朋友,我特意整理了一下,里面的技术不是靠几句话就能讲清楚,多问题其实答案很简单,但是背后的思考和逻辑不简单,要做到知其然还要知其所以然。如果想学习Java工程化、高性能及分布式、深入浅出。性能调优、Spring,MyBatis,Netty源码,数据结构,jvm,多线程等等,由于篇幅有限,以下只展示小部分面试题,有需要完整版的朋友可以点一点链接跳转领取,链接:戳这里免费下载,获取码:掘金
本文转载自: 掘金