因为要最近要面试,冲刺挑战一下,下面是准备的中级面试题--hashmap 源码分析的面试题
大家也可以关注我的个人博客:http://idearyou.cn/,个人公众号:纯洁的麦田
1、hashcode与equals区别
答:如果对象的hashcode相等,内容不一定相等
equals内容相等,,hashcode一定相等
2、重写equals为啥要重写hashcode
答:因为要equals内容相等,hashcode不一定要冲突
3、hashmap和hashtable区别
答:hashmap可以存放空,不安全,效率高,hashtable加锁,安全,不能放空
4、如何理解hashcode碰撞
答:对象不等,但hashcode会相同,导致hashcode碰撞
5、如何理解hashcode碰撞
6、hashmap的put方法如何实现
答:1.Jdk1.7采用数组+链表通过头插入法(在多线程扩容数组,可能会产生死锁)实现,采用hashEntry封装键值对。
2.根据key计算hashcode得出index存放下标,如产生碰撞则采用链表存放。
3.hashmap根据key查询键值对时间没有产生冲突情况下时间复杂度为O1,查询hashmap产生冲突的key时间复杂度为ON,所以1.8中当链表长度大于8并且长度为64情况下转红黑树存放
7、hashmap扩容如何实现
答:hashmap数组默认大小16,加载因子0.75,扩容对原数据乘2
8、扩容加载因子为啥是0.75
答:科学家证明0.75是黄金比例,加载因子小,key冲突比较小,浪费空间,因子越大,冲突较多,节约内存
9、hashmap为空,数组存放在那个位置
答:存放下标为0,第一个链表
10、haskmap是否可以存放自定义对象为key
答:可以,因为是泛型
11、hashmap在Jdk1.7和jdk1.8中区别
答:1.7:数组+链表,1.8:数组+链表+红黑树
12、jdk1.7中扩容死循环有遇见吗
答:在1.7中使用头插入法,多线程情况下会导致死循环
13、hashmap在Jdk1.8较1.7有哪些改进
答:尾插入法、解决红黑树、链表长度 > 8就转换红黑树
14、hashmap在1.8中为啥改成红黑树
答:如果下标index冲突过多,导致链表长度过长,时间复杂度为On,查询速度慢,当链表长度 > 8并且容量 > 64,转成红黑树,时间复杂度变O(long)
15、hashmap不安全,有哪些替代方案
答:ConcurrentHashmap、conllections、synize加锁
个人博客:
名称:纯洁的麦田
链接:http://www.idearyou.cn/
描述:争取哪一天做上架构师
公众号:纯洁的麦田
另外:个人公众号,每天有新java文章,还有中高级面试题分享