天下无难试之HashMap面试刁难大全

  • 时间:
  • 浏览:1

Get最好的方式的时间繁杂度是十哪几个 ?

loadFactor表示HashMap的拥挤程度,影响hash操作到同一有一4个数组位置的概率。默认loadFactor等于0.75,当HashMap上面容纳的元素原因分析达到HashMap数组长度的75%时,表示HashMap太挤了,时需扩容,在HashMap的构造器中可不时需定制loadFactor。

小伙伴们在回答这道题是有后来 后来 人会后来刚结束了怀疑人生,大伙儿的脑细胞什儿 后来会经常再次出现短路问题报告 。明明是O(1)啊,平时都记得牢牢的,曾经刚才Get最好的方式的流程里时需遍历链表,遍历的时间繁杂度难道全版都会O(n)么?此刻观察那此孩子们的表情是非常卡哇伊呢的。当然还后来 甚至是科班的小伙伴真是 没听过时间繁杂度,想到这里我也后来刚结束了怀疑人生了。当大伙儿卡壳的后来,我会稍微提醒一下,问下面的什儿 道题。

当然全版都会,应用线程池池安全的HashMap是ConcurrentHashMap。关于ConcurrentHashMap还可不时需问后来 后来 问题报告 ,这就时需另一篇文章来具体讲解了。

HashMap的底部形态无疑是Java面试中经常再次出现频率最高的一道题,什儿 题是找不到之常见,应该每当时人都会信手拈来。曾经就在我经历过的无数【允许我夸张一下】面试当中,能全版回答我提出的HashMap问题报告 的人却是寥寥无几,如今这道题我原因分析问的很重厌烦了。

先调用Key的hashcode最好的方式拿到对象的hash值,后来 用hash值对第一维数组的长度进行取模,得到数组的下标。什儿 数组下标所在的元素后来第二维链表的表头。后来 遍历什儿 链表,使用Key的equals同链表元素进行比较,匹配成功即返回链表元素里存放的值。

请解释一下HashMap的参数loadFactor,它的作用是那此?

嗦嘎!链表的长度很短,相比总元素的个数可不时需忽略不计。什儿 后来小伙伴们的眼睛通常会后来刚结束了发光,很童贞。作为面试官是很喜欢看得人什儿 眼神的。我使用反射统计过HashMap上面链表的长度,在HashMap里放了80w个随机字符串键值对,发现链表的长度几乎从来找不到超过7什儿 数字,当我增大loadFactor的后来,才会偶尔经常再次出现十哪几个 长度为8的链表来。于是问题报告 又来了。

假使 HashMap里的元素有80w个,请问第二维链表的长度最少是十哪几个 ?

原文地址:https://www.jianshu.com/p/42135dbb943c

有后来 后来 同学都没具体去深入关注Java8的新底部形态,原因分析大伙儿回答不上来,我后来会感到失望。原因分析到什儿 问题报告 的后来,原因分析只剩下15%的同学必须了,原因分析再打击大伙儿,看着大伙儿家道中落的身影走出了大门,我全版都会对当时人感到失望了,为甚招当时人就找不到困难?

你了解Redis么,你知道Redis上面的字典是怎样扩容的么?

请说明一下HashMap扩容的过程

Get最好的方式的流程是怎样的?

这道题的关键在于原因分析Key的hashcode全版都会随机的,后来人为特殊构造的话,找不到第二维链表原因分析会无比的长,后来 分布极为不均匀,什儿 后来就会经常再次出现性能问题报告 。比如大伙儿把对象的hashcode都统一返回一有一4个常量,最终的结果后来hashmap会退化为一维链表,Get最好的方式的性能巨降为O(n),使用红黑树可不时需将性能提升到O(log(n))。

扩容时需重新分配一有一4个新数组,新数组是老数组的2倍长,后来 遍历整个老底部形态,把所有的元素挨个重新hash分配到新底部形态中去。什儿 rehash的过程是很耗时的,很重是HashMap很大的后来,会原因分析应用线程池池卡顿,而2倍内存的关系都会原因分析内存瞬间溢出,实际上是3倍内存,原因分析老底部形态的内发生rehash后来结束了后来还必须立即回收。那为那此必须在HashMap比较大的后来扩容扩少后来 呢,关于什儿 问题报告 我也找不到非常满意的答案,我只知道hash的取模操作使用的是按位操作,按位操作时需限制数组的长度时需是2的指数。另外后来Java堆内存底层用的是tcmalloc这类library,它们在内存管理的分配单位后来以2的指数的单位,2倍内存的递增有益于减少内存碎片,减少内存管理的负担。

好,原因分析这道题你也回答正确了,恭喜你,毫无无疑,你是一位很有钱途的高级应用线程池池员。

HashMap是应用线程池池安全的么?

二维底部形态,第一维是数组,第二维是链表

HashMap的底部形态是怎样的?

既然链表找不到短,为甚Java8要对HashMap的链表进行改造,使用红黑树来代替链表呢?