zoukankan      html  css  js  c++  java
  • 面试必问系列——hashmap的默认扩容阈值是大于12还是大于等于12

      hashmap的默认扩容阈值是大于12还是大于等于12?没错我们初学者看源码,一看就知道是16*0.75=12,所以12是一个扩容阈值的关键字,但是翻看各种博文,有说大于12的,有说等于12的,所以今天楼主雄起了,给大家总结一下,此外顺便说明一下其他容易搞混的问题,比如链表转红黑树的阈值是大于8还是等于8

      面试官抠着脚进来了

      面试官:看过JDK源码吧,说说hashmap的初始化长度是多少呢?

      我:easy,16

      面试官:哦,那我new HashMap()之后,马上就是16吗?

      我:是的

      面试官:出门右拐,开窗户自由落体下去

      我:嘿嘿,面试官我是逗你的,真正创建一个16长度的数组是在第一次put的时候,做一次判断,如果长度为0或者为null的话,就做一次扩容,数组也是在这个时候初始化的

      面试官:你这么优秀,快赶上我的脚指头了

      我(内心):我有这么臭吗

      面试官:说到扩容,你讲一下扩容的源码吧

      我:巴拉巴拉小魔仙

      面试官:等一下,你刚才说数组长度大于等于12就会扩容?

      我:额,(内心:你都反问了,应该就是说错了),不是不是,是大于12的时候,也就是说扩容是发生在第13次put的时候

      面试官:算你机灵,那你说说引入红黑树后,链表转换为红黑树的阈值是多少,是大于8还是等于8,另外,红黑树会退化为链表吗?会的话阈值是多少,说清楚是大于还是大于等于

      此时面试官已经用鼻孔看你了,必须要拿出真本事,不能再含糊不清的蒙混了

      我:当链表长度大于8时转换为红黑树,小于6时退化为链表,中间数是为了过度使用,防止链表与红黑树之间频繁的转换,造成效率低下

      面试官:链表的初始长度为什么要设为16,17不信吗?

      我:这个问题很玄学,但是根据hashmsp的源码注释来看,作者指明了选取16是根据泊松分布取的

     

    总结:hashmap的初始容量是16,在第一次put的时候进行的扩容初始化,链表长度大于8时才会转换为红黑树,红黑树长度小于6时会退化为链表,扩容因子是0.75,初始化扩容阈值为大于12。这些问题有时候面试官也不清楚,我遇到过,你只要说出来关键字16,12,8,6就可以,但是对于大牛来说蒙混是不行滴,打铁还要自身硬

  • 相关阅读:
    Verilog开发之“新Iverilog工具认识”
    苹果开发之“swift简单按钮加1计数入门”
    基于现有.net core框架模版修改
    Sql50语句小练
    因有个社区:入了一个新的时代!
    .Net Core下建立web应用的 路由器修改
    一个网站的渗透测试思路,流程(给你一个网站,怎么做?)
    windows服务
    我知道的代码生成器
    Extjs 自动列宽
  • 原文地址:https://www.cnblogs.com/wudb/p/12980680.html
Copyright © 2011-2022 走看看