一道HashMap面试题

1、你看过那些源码吗?

集合类

2、那你能讲讲HashMap的实现原理吗?

1.7 数组+链表;1.8 数组+链表+红黑树

3、HashMap什么时候会进行rehash?

当HashMap容量大于阈值时(阈值 = 初始数组长度+默认加载因子) 默认加载因子=0.75

4、HashMap什么时候会进行扩容?

扩容的两个条件:1.容量大于阈值2.产生了hash碰撞

5、那HashMap的初始容量设置成多少比较合适呢?

初始容量应该=(需要存储的元素个数/默认加载因子)+1,HashMap会选择大于该初始容量的第一个2的幂作为初始容量

6、结合源码说说HashMap在高并发场景中为什么会出现死循环?

https://blog.csdn.net/qq_36520235/article/details/86653136
扩容后的rehash,多线程造成链表的回路.

7、JDK1.8中对HashMap做了哪些性能优化?

加入红黑树,当链表的长度大于8时,转换为红黑树的结构;

8、HashMap和Hashtable有何不同?

https://blog.csdn.net/wangxing233/article/details/79452946
a.产生时间不同
Hashtable在java一发布就提供了,而HashMap产生于java1.2;
b.继承父类不同
HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary类;
(相同:都实现了同时实现了map、Cloneable(可复制)、Serializable(可序列化)这三个接口)
c.对null处理你不同
Hashtable既不支持Null key也不支持Null value。
HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null;
d.线程安全不同
Hashtable是线程安全的(操作都有synchronized实现),而HashMap线程不安全;
e.初始容量大小和每次扩充容量大小的不同
Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1;
HashMap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍;
f.计算hash值的方法不同
Hashtable直接使用对象的hashCode:
java int hash = key.hashCode(); int index = (hash & 0x7FFFFFFF)%table.length;
HashMap为了提高计算效率,将哈希表的大小固定为了2的幂,这样在取模预算时,不需要做除法,只需要做位运算;

线程是否安全: HashMap 是非线程安全的,HashTable 是线程安全的;HashTable 内部的方法基本都经过synchronized 修饰。(如果你要保证线程安全的话就使用 ConcurrentHashMap 吧!);
效率: 因为线程安全的问题,HashMap 要比 HashTable 效率高一点。另外,HashTable 基本被淘汰,不要在代码中使用它;
对Null key 和Null value的支持: HashMap 中,null 可以作为键,这样的键只有一个,可以有一个或多个键所对应的值为 null。。但是在 HashTable 中 put 进的键值只要有一个 null,直接抛出 NullPointerException。
初始容量大小和每次扩充容量大小的不同 : ①创建时如果不指定容量初始值,Hashtable 默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap 默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。②创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为2的幂次方大小(HashMap 中的tableSizeFor()方法保证,下面给出了源代码)。也就是说 HashMap 总是使用2的幂作为哈希表的大小,后面会介绍到为什么是2的幂次方。
底层数据结构: JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制。

9、HashMap 和 ConcurrentHashMap 的区别?

https://www.cnblogs.com/ng-xixi/p/9942256.html
HashMap线程不安全;
ConcurrentHashMap线程安全(并不是绝对的线程安全),采用锁分段;(可重入锁)

10、ConcurrentHashMap和LinkedHashMap有什么区别?

https://www.cnblogs.com/ng-xixi/p/9942256.html

11、为什么HashMap中的链表转红黑树的阀值是8?

https://blog.csdn.net/sinat_41832255/article/details/88884586

12、什么是ConcurrentSkipListMap?他和ConcurrentHashMap有什么区别?

https://www.cnblogs.com/ygj0930/p/6543901.html

posted @ 2019-06-20 10:25  XueXueLai  阅读(162)  评论(0编辑  收藏  举报