记录下最近面试遇到的拿不准的问题
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函数