关于学习HashMap的问题分析

最近学习了一下Hashmap底层用到的数据结构,心中有几个问题。
1.为什么hashmap要采用链表法解决hash冲突呢?
2.为什么hashmap在jdk1.8中,当链表长度大于当链表长度大于8时,链表就转化为红黑树呢?

1.为什么hashmap要采用链表法解决hash冲突呢?
要了解这方面原因,就要分析,解决开放寻址法和链表法的优缺点。

开放寻址法
优点:将数据存储在数组中;利用CPU缓存加快查询速度;并且序列化简单。
缺点:删除数据麻烦,需要特殊标记已删除的数据;需要将所有数据存储在一个连续的存储空间中,比起链表来说,冲突的代价更高。
适用场景:当数据量较小、装载因子小的时候可以采用开放寻址法。

链表法
优点:对内存利用率高;对装载因子的容忍度高(开放寻址法只适用在装载因子小于1的情况,接近1时,就可能会有大量散列冲突,导致大量的探测、再散列,性能下降很多。但对于链表法,只要散列函数的值随机均匀,当装载因子大于1时,只是对应的链表长度增加,这里也可以通过将链表改造为跳表或者红黑树的方式加快查找速度)
缺点:由于链表需要存储指针,存储较小的对象时,指针占用的内容消耗比较大;链表不支持随机查找,查找效率较低。
适用场景:适合于存储大对象、数据量大的散列表;比开放寻址法更加灵活,支持更多的优化策略,如使用红黑树替代链表。
适用场景:适合于存储大对象、数据量大的散列表;比开放寻址法更加灵活,支持更多的优化策略,如使用红黑树替代链表。

总结,通过比较两者的优缺点,链表法显然更合适。

2.为什么hashmap在jdk1.8中,当链表长度大于当链表长度大于8时,链表就转化为红黑树呢?
因为当链表过长的时候,查找的效率将会变慢,利用红黑树快速增删改查的特性,可以提高 HashMap的性能,而链表不长时,红黑树的快速增删改查的特性就不太明显,并且红黑树的还有维护成本,因此当链表不长时,不需要将链表转化为红黑树。

参考链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值