HashMap史上最全面试题

HashTable和HashMap有啥区别?

HashTable是线程安全的,不允许key为空,方法上加上了同步锁synchronized;

HashMap是线程不安全的,允许存放key为空。

HashMap的key为空数据存放在数组那个位子?

存放到下标为0的位子也就是第一个链表,只能够存放一个为null的key值。

HashMap是否可以存在自定义对象作为key?

可以,hashMap是泛型的。

HashMap1.7和1.8的区别?

1.7底层采用数组+链表结构实现;1.8底层采用数组+链表+红黑树结构

HashMap是如何解决Hash冲突的问题

使用链表存放hash值相等且内容不等,存放到同一个链表中。

HashMap的put方法底层是如何实现的?

1.判断key如果为空的情况下,存放数组0

2.默认HashMap初始容量为16,加载因子大小为16*0.75=12 每次扩容*2倍

3根据key计算hash值,存放到数组下标位子。

4.如果hash值相等,但是内容不同,存放在链表中

5.如果当前size>加载影子阈值,开始*2倍扩容

HashMap的加载因子的值为什么是0.75而不是其他的?

折中的方案,空间利用率高 冲突少 0.75最合适

HashMap根据key查询时间复杂度是多少?

HashMap根据key之计算index值,直接从数组中查询数据。

分两种情况:

1.如果index没有产生冲突,直接获取值,时间复杂度o(1)

2.如果index产生了冲突,遍历链表,时间复杂度为0(n)

HashMap1.8为什么要引入红黑树?

如果index冲突过多,导致链表过长,因为链表时间复杂度为0n。为了解决链表查询速度慢的问题,引入了链表长度大于8并且数组的容量大于64的情况就开始将链表转换红黑树存放,这时候时间复杂度从o(n)变成了o(logn)

HashMap线程不安全,有其他地台方案吗?

1.使用ConcurrentHashMap

2.使用Collections.synchronizedMap(HashMapObject)

红黑树和链表的时间复杂度分别是多少?

红黑树的时间复杂度为o(logn)

链表的时间复杂度为o(n)

发布了119 篇原创文章 · 获赞 35 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/q15102780705/article/details/105519478