Java初级程序员面试总结(二) --HashMap篇

Java初级程序员面试总结(二)

引言:
我是一个菜鸟程序员,坐标HZ,以下为整理的面试题.
Q1: Hashmap源码你看过没?
Answer: hashmap在jdk1.8之前,采用数组+链表的结构.在jdk1.8及以后,采用数组+链表/红黑树的结构.hashmap在1.8及以后的版本,初始容量为0.在第一次put时,如果初始容量为0,那么容量修改为16.调用本地的hashcode方法计算hash值.将hash值异或高16位,使其重复参与运算.再通过与上数组的length-1,得到数组的索引值.如果key为null,调用响应的方法进行存储.不为null,调用equals方法比较key是否相同,如果相同,进行覆盖.如果不同,发生hash碰撞.如果大于等于8,放到红黑树中.当进行树形化且容量小于64时,发生扩容,扩容2倍.如果长度不大于等于8,放到链表中.如果hashmap Entry数量大于容量负载因子(默认16),则发生扩容.当树形化长度小于等于6时,退回链表.hashmap在1.8之前时,entry数量大于等于容量负载因子(默认16)且发生hash碰撞时,进行扩容,扩容2倍.
Q2: 快速失败和安全失败的区别?
Answer: 快速失败是并发修改异常,常见于Arraylist,原理是在for循环时,其count与之前的count不同,当其进行add或者remove时,会修改count值.这样子,原先的count值与for循环中的count不同,抛出此异常.可以使用迭代器或者安全失败解决.安全失败是并发包中的,复制原先循环的内容,使用add或者remove时修改复制的内容.最后结束循环后完成修改.
Q3: ConcurrentHashMap1.7和1.8的区别
Answer: 1.7采用分段锁机制,将entry一段段锁起来,分成16个锁,每个锁放入2个entry,其中默认的8个没有entry,有新的entry再进行分配.1.8采用CAS+sync的办法,使用CompareAndSwap方法,用内存值V比较旧值A,如果相同,用新值B代替旧值A.其中会产生ABA问题,可以使用Version来解决.
Q4: 什么map适合存null?
Answer: Hashmap,其他map都不能存null.在源码中Concurrent,Table等都会检查key和value是否包含null,包含抛出空指针异常


集合源码有兴趣的可以看一下,面试主要问Hashmap,ConcurrentHashMap,ArrayList等
主要是数组,链表,树,栈,队列等数据结构

发布了3 篇原创文章 · 获赞 4 · 访问量 52

猜你喜欢

转载自blog.csdn.net/qq_21010115/article/details/104879563
今日推荐