HashMap之面试官和你

面试官:简单介绍下HashMap?

你:HashMap是用来存储KeyValue的容器类。它是由数组和链表组成的,当链表达到8的时候会转换成红黑树。数组的大小可以使用initialCapacity提前设置,默认16,减少插入数据时候扩容的消耗。扩容是基于负载因子loadFactor,默认为0.75。

 

面试官:为什么loadFactor是0.75?

你:因为负载因子越大,链表就会越长,节省了空间,但造成查询时间变长,负载因子越小,链表越小,HashMap会变得稀松,占据太多空间,但查询时间变快。

 

面试官:那为什么加载因子越大,链表就越大呢?

你:链表就是用来解决哈希碰撞的问题的,复杂因子越大,造成哈希碰撞的几率就越大,从而链表就越长,查询就越慢。

 

面试官:那HashMap的查询,get的时间复杂度是多少呢?

你:最好情况下是O(1),当存储为链表时是O(1+n),当存储为红黑树时是O(1+ logn)。

 

面试官:你之前说链表达到8时就变成红黑树,是为什么?

你:根据一个什么实验(官方根据泊松分布实验)来着,我记不得了,假设hashmap长度length为16,放12(0.75*16)个数据到hashmap中,链表中存放8个节点的概率仅为0.00000006。几率很小。链表转红黑树还是很耗性能的,主要原因是超过8以后,红黑树的查询速度相对于链表更快。

 

面试官:为什么初始容量最好是2 的整数次幂?

你:HashMap采用了链地址

 

面试官:为什么初始容量是16?

你:初始容量最好是2 的整数次幂,主要是因为HashMap的计算公式是(n-1)&hash,与运算的结果是0或1,而如果是奇数,n-1就是偶数,与运算后基本都是0,所以设为16可以使元素均匀分布,减少哈希碰撞。

 

面试官:那你看完是不是觉得很赞?

你:下次一定

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值