每天一道面试题05:HashMap相关面试题
HashMap在jdk1.7和jdk1.8的区别
-
底层结构:在1.7采用数组+链表,在1.8采用数组+链表+红黑树
-
初始化方式:1.7采用inflateTable()初始化数组;1.8采用resize()扩容
-
put实现方式:1.7采用头插法,1.8采用尾插法
-
hash实现方式:1.7直接计算key的hashcode值;1.8采用(key的hashcode值)异或(key的hashcode值无符号右移16位)的结果
-
扩容策略:在1.7的时候,只要元素个数不小于阈值(加载因子0.75)直接扩容2倍。在1.8的时候,单链表元素超过8个,将单链表转换成红黑树,若红黑树结点小于6个,将红黑树转换成单链表。
Hash冲突及其解决
hash冲突:key通过hash函数得到的结果作为地址存储键值对,当计算发现这个地址已经存储了键值对,这就发生了hash冲突。
1、开放定址法:一旦产生了冲突,就按某种规则去寻找另一空地址,若发生了第 i 次冲突,试探的下一个地址将增加di,基本公式是:
线性探测:di = i
平方探测:di = ± i2( +12, -12, +22, -22……)
双散列:di = i * h2(key)
2、再哈希法:对冲突的hash值再进行哈希处理
3、链地址法:将产生冲突的元素放在一个单链表上
4、建立公共溢出区:将哈希表分为基本表和溢出表两部分,凡是和基本表产生冲突的元素都放入溢出表
HashMap原理
-
数组每一个元素都是单链表
-
加载因子0.75,即容量使用3/4就开始扩容
-
不可重复
-
无序,因为不知道值挂到哪个单链表了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律