java实习生面试题-HashMap

这篇博客详细解析了Java HashMap的工作原理,包括1.8前后的变化,如从头插法到尾插法,以及为何选择链表再转红黑树。还介绍了HashMap的Hash冲突解决、key值存储索引的计算方式、数组长度为2的幂次方的原因,以及put方法的执行流程。博客探讨了HashMap的性能优化和线程安全性问题。
摘要由CSDN通过智能技术生成

1:HashMap的工作原理是什么?

(1)1.8以前,采用头插法,多线程环境下会造成扩容死锁,HashMap的数据结构是:数组+链表

(2) 1.8以后,采用尾插法。HashMap的数据结构是:数组+链表+红黑树,当链表长度大于等于8(根据统计概率选择的),且数组长度大于64由链表变成红黑树。当链表长度小于6,由红黑树(0log(n)变成链表,负载因子为0.75的时候,碰撞概率最低,但HashMap依然不是线程安全的。

2.解决Hash冲突的时候,为什么不可以直接用红黑树,而选择先用链表,再转红黑树,如果不用红黑树,可以用二叉树查找吗?

(1)红黑树需要左旋,右旋,变色一系列操作来保持平衡,而单链表不需要,当元素个数小于8,使用单链表,大于8,需要红黑树(Olog(n)来提升查询速率,链表的时间复杂度为O(n).

(2)可以,但二叉查找树在特殊情况下会变成 线性结构,遍历查找会很慢

3.hashmap中key值的存储索引是怎么计算的?

(1) 根据key值计算出Hashcode值,根据hashcode值计算出hash值&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值