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

  • 时间:
  • 浏览:0

HashMap的行态是如可的?

这道题的关键在于机会Key的hashcode都是随机的,我想要 人为特殊构造话语,那么第二维链表机会会无比的长,我想要 分布极为不均匀,这种我想要就会出显性能现象。比如亲戚我们都都 把对象的hashcode都统一返回一另1个 常量,最终的结果我想要 hashmap会退化为一维链表,Get最好的办法的性能巨降为O(n),使用红黑树能不都都后能 将性能提升到O(log(n))。

既然链表那么短,为什么会么会Java8要对HashMap的链表进行改造,使用红黑树来代替链表呢?

当然都是,守护守护进程安全的HashMap是ConcurrentHashMap。关于ConcurrentHashMap还能不都都后能 问所以 现象,这就须要另一篇文章来具体讲解了。

好,机会这道题你也回答正确了,恭喜你,毫无无疑,你是一位很有钱途的高级守护守护进程员。

HashMap是守护守护进程安全的么?

Get最好的办法的时间复杂度是几次?

HashMap的行态无疑是Java面试中出显频率最高的一道题,这种题是那么之常见,应该每我每每各自 前会信手拈来。我想要就在我经历过的无数【允许我夸张一下】面试当中,能完正回答我提出的HashMap现象的人却是寥寥无几,如今这道题我机会问的有点儿厌烦了。

嗦嘎!链表的长度很短,相比总元素的个数能不都都后能 忽略不计。这种我想要小伙伴们的眼睛通常会结束了英文发光,很童贞。作为面试官是很喜欢看到这种眼神的。我使用反射统计过HashMap上面链表的长度,在HashMap里放了30w个随机字符串键值对,发现链表的长度几乎从来那么超过7这种数字,当我增大loadFactor的我想要,才会偶尔出显几次长度为8的链表来。于是现象又来了。

loadFactor表示HashMap的拥挤程度,影响hash操作到同一另1个 数组位置的概率。默认loadFactor等于0.75,当HashMap上面容纳的元素机会达到HashMap数组长度的75%时,表示HashMap太挤了,须要扩容,在HashMap的构造器中能不都都后能 定制loadFactor。

二维行态,第一维是数组,第二维是链表

有所以 同学都没具体去深入关注Java8的新行态,机会亲戚我们都都 回答不上来,我我想要 会感到失望。机会到这种现象的我想要,机会只剩下15%的同学不都都后能 了,机会再打击亲戚我们都都 ,看着亲戚我们都都 落难的身影走出了大门,我都是对我每每各自 感到失望了,为什么会么会招我每每各自 就那么困难?

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

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

小伙伴们在回答这道题是有所以 人会结束了英文怀疑人生,亲戚我们都都 的脑细胞这种时候会出显短路现象。明明是O(1)啊,平时都记得牢牢的,我想要刚才Get最好的办法的流程里须要遍历链表,遍历的时间复杂度难道都是O(n)么?此刻观察哪几种孩子们的表情是非常卡哇伊呢的。当然还一点甚至是科班的小伙伴果真没听过时间复杂度,想到这里我也结束了英文怀疑人生了。当亲戚我们都都 卡壳的我想要,我会稍微提醒一下,问下面的这种道题。

Get最好的办法的流程是如可的?

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

请解释一下HashMap的参数loadFactor,它的作用是哪几种?

扩容须要重新分配一另1个 新数组,新数组是老数组的2倍长,我想要 遍历整个老行态,把所有的元素挨个重新hash分配到新行态中去。这种rehash的过程是很耗时的,有点儿是HashMap很大的我想要,会原因分析 守护守护进程卡顿,而2倍内存的关系前会原因分析 内存瞬间溢出,实际上是3倍内存,机会老行态的内发生rehash结束了英文我想要还不都都后能 立即回收。那为哪几种不都都后能 在HashMap比较大的我想要扩容扩少一点呢,关于这种现象我也那么非常满意的答案,我只知道hash的取模操作使用的是按位操作,按位操作须要限制数组的长度须可是2的指数。另外我想要 Java堆内存底层用的是tcmalloc类式library,它们在内存管理的分配单位我想要 以2的指数的单位,2倍内存的递增促进减少内存碎片,减少内存管理的负担。

请说明一下HashMap扩容的过程

我想要HashMap里的元素有30w个,请问第二维链表的长度共可是几次?