HashMap底层原理

hashmap的底层数据结构 1.8之前和1.8的区别?

1.8之前:
在这里插入图片描述

HashMap在存储元素时,首先会获取元素的哈希值结合位移运算,计算出该元素在数组中的位置,如果当前位置没有元素,就在该位置直接添加元素,如果该位置已存在其他元素,就会调用hashcode方法,来比较元素的hashcode值是否一致,如果不一致,那么就在该索引位置上划分出一个节点来存储当前元素。如果一致,需要进一步比较元素equlas方法,比较key的内容是否一致,如果不一致,在当前索引值上划分一个节点来存储当前元素,如果一致,那么后面的元素的value值要覆盖前面的value

1.8之后:
但是在jdk1.8之后,HashMap 进行了一些修改,最大的不同就是利用了红黑树,所以其由 数组+链表+ 红黑树组成。因为在1.7的时候,这个链表的长度不固定,所以如果key的hashcode重复之后,那么对应的链表的数据的长度就无法控制了,get数据的时间复杂度就取决于链表的长度了,为了提高这一部分的性能,加入了红黑树,如果链表的长度超过8位之后,会将链表转换为红黑树,极大的降低了时间复杂度

HashMap存储过程:

1.当创建HashMap结合对象时,在jdk1.8之前,构造方法中创建一个一个长度是16的Entry[] table用来存储键值对数据的
在jdk1.8之后不在是HashMap的构造方法底层创建数组了,实在第一次调用put方法是创建的数组,Node[] table用来存储键值对数据的。
2.假设想哈希表中存储“xxx”,根据“xxx”调用String类中重写之后的hashcode方法计算出值,然后结合数组的长度采用某种算法计算出想Node数组中存储数据的空间索引值。如果计算出的索引空间没有值则直接将“xxx”放进去。

面试题:哈希表底层采用何种算法计算hash值,还有那些算法可以计算hash值?

底层采用的是key的hashcode方法的值结合数组长度进行(位移运算)无符号右移(>>>),按位移或(^),按位与(&)计算出索引
换可以采用:平方取中法、取余数、伪随机数法、拉链法等

面试题:当两个对象的hashCode相等时会怎样

会产生哈希碰撞,若key值内容相同则替换旧的value,不然连接到列表后面,链表长度超过阔值8就会转换为红黑树存储

面试题:何时发生哈希碰撞和什么是哈希碰撞,如何解决

只要两个元素的key计算的哈希码值相同就会发生哈希碰撞。jdk1.8前使用链表解决哈希碰撞。jdk1.8之后使用链表+红黑树解决哈希碰撞

面试题:如果两个键的hashcode相同,如何存储键值对

hashcode相同,通过equlas比较内容是否相同
相同:则新的value覆盖之前的value
不相同:则将新的键值对添加到哈希表中

hashmap的构造函数哪些?

1.public HashMap(int initialCapacity, float loadFactor)
2.public HashMap(int initialCapacity)
3.public HashMap()
4.public HashMap(Map<? extends K, ? extends V> m)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值