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 总结

后来也查看了相关的资料,发现以前也有人讲过,也许是这点优化并不能带来很大的性能提升,所以都没有引起大家的注意,但是我认为这种随手就能提高一点系统性能的写法,可以是一个开发的好习惯。

posted @ 2023-05-06 23:07  fengzeng  阅读(60)  评论(0编辑  收藏  举报