每天一道面试题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就开始扩容
  • 不可重复
  • 无序,因为不知道值挂到哪个单链表了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值