面试必问系列——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就可以,但是对于大牛来说蒙混是不行滴,打铁还要自身硬