2021-06-01

记录下最近面试遇到的拿不准的问题
1.链表和数组遍历的效率?

一开始认为顺序遍历应该差不多,实际上还要考虑到CPU、缓存、内存相关的地方
链接: 为什么数组遍历比链表快,从CPU和内存的角度理解
数组做为连续内存,CPU缓存会把一片连续的内存读入,比如读array[0]时会将array[1]·····读入,下次直接读取缓存会很快。但是链表是跳跃式地址,无法做上述操作,每次都要到内存中查,所以会差一些。

2.HashMap中是直接使用key的hashcode()与上数组长度-1来寻址吗?

不是,中间还对key.hashCode()做了运算。

做了什么运算?意义是什么?

之前没深究,实际上hash()方法是对key.hashCode()的高位和低位做了异或,术语叫“扰动函数”,意义就是:如果直接用key.hashCode()&(size-1)寻址的话,内存是一定存不下Integer.MAX_VALUE长度的hash表的,(比如长度是2的20次方),那hashCode中的前31-n位就没有参与寻址的运算,较坏的情况下可能几个key,二进制后20位都一样,但是前12位不一样,结果是映射到相同地址,就造成了冲突,利用这个扰动函数将前16位^后16位可以避免这种情况,盗图:在这里插入图片描述
链接: HashMap中的hash函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值