HashMap设置初始容量一直都用错了?
1 背景
今天在代码审查的时候,发现一位离职的同事留下了这样一串代码:
Map<String,String> map = new HashMap<>((int)(list.size()/0.75F+1));
第一反应是:又在炫技,又在搞这些花里胡哨的东西。
但是看到0.75
的我却陷入了沉思,稍微深入了解过Map的应该都知道,Map中有个属性,叫做负载因子,刚好默认也是0.75
。
负载因子的作用:减少Hash碰撞,假如初始容量设置为8,那么实际可容纳的元素是8*0.75=6,如果元素超过了6就会进行扩容
2 思考
虽然认出了0.75是负载因子的默认值,但是 list.size()/0.75F+1
是什么意思还是不太明白,我就假如 list.size()
等于 16
,带进去算,得到的初始值是22
,由于Map
会自动向上去冥整,所以最后得到的初始容量是32
如果使用平时自己的写法Map<String,String> map = new HashMap<>(list.size())
,初始容量是16
看到这里,突然就明白了,初始容量是16的时候,显然是容纳不下16个元素的(实际只能容纳12个元素,超过12个就会进行扩容操作),而第一种写法,初始容量是32,就能避免扩容操作
3 总结
后来也查看了相关的资料,发现以前也有人讲过,也许是这点优化并不能带来很大的性能提升,所以都没有引起大家的注意,但是我认为这种随手就能提高一点系统性能的写法,可以是一个开发的好习惯。