HashMap面试题

1、HashMap底层原理

HashMap在jdk1.7版本中采用的是数组+链表实现的,而在jdk1.8中则采用数组+链表+红黑树实现的。那么为什么在jdk1.8版本中引入了红黑树呢?在HashMap存值时,如果index发生冲突,则将值存放在链表当中。我们知道,在链表做查询的时候,是需要从头部查询到尾部的,如果链表过长,那么我们的查询效率会非常底。所以在jdk1.8中引入了红黑树,当数组长度>=64,且链表长度>8时,就会把链表转换成红黑树,以提高查询效率。

2、HashMap的时间复杂度

当我们的HashMap存值没有发生index冲突的情况下,我们的复杂度为O(1),在发生冲突时,将冲突的值存入链表时,也就是我们的jdk1.7版本用链表存储时,我的的复杂度为O(n),但在jdk1.8引用了红黑树,当数组长度>=64,且链表长度>8时,就会把链表转换成红黑树,复杂度就为O(logn)。

3、HashMap7发生扩容死循环问题

HashMap本身是非线程安全,不推荐在多线程中去使用。HashMap在jdk1.7使用的是头插法,后在jdk1.8中改为尾插法才解决此问题。如果是在多线程的情况下,推荐使用ConcurrentHashMap。

4、HashMap底层是有序存放的么

HashMap是无序存放的,因为Hash算法是散列计算的没有顺序,如果需要顺序存放可以使用LinkedHashMap,它在HashMap的基础上新引用了一条双向链表来存放。

5、HashMap Key 为null 存放在什么位置

存放在数组index为0的位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值