[HashMap] 初始化时,需要指定初始值大小吗?

2023-10-12 11:48:12 +08:00
 worldqiuzhi

提交代码被代码扫描工具拦截了

提示: [ HashMap ] 初始化时,尽量指定初始值大小

平时没这么写过,去 GitHub 搜索关键字,这么写的有但不多,可能百分之一吧

你们会怎么写 Map<X, T> map = new HashMap<> Map<X, T> map = new HashMap<initial>

如果写初始值怎么写,直接填写数字 还是定义一些全局的常量

868 次点击
所在节点    问与答
8 条回复
zjp
2023-10-12 11:55:59 +08:00
全局常量不如不写
指定初始大小是为了尽量减少扩容次数不是为了抑制告警
TWorldIsNButThis
2023-10-12 12:01:38 +08:00
几乎没手动 new 过 hashmap
不过非要给某些固定的几个 key value new 的时候的确会装模作样的加个 capacity
如果是 Java 的话这个 capacity 是不算 load factor 的,你还得手动换算一下才能有想要的效果(不扩容)

高版本有帮你算好的 api
Mystery0
2023-10-12 12:46:48 +08:00
如果以前预知大小的话,会写成对应的值,例如任何情况下都不会塞进去多于 100 的值,那就写 100 ;以及预知会很多数据但是不确定具体数据的时候,也会写一个差不多的数来避免后续频繁的扩容
Mystery0
2023-10-12 12:47:40 +08:00
@Mystery0 我该换一个输入法了.....


如果已经预知大小的话,会写成对应的值,例如任何情况下都不会塞进去多于 100 的值,那就写 100 ;已经预知会很多数据但是不确定具体数据的时候,也会写一个差不多的数来避免后续频繁的扩容
cslive
2023-10-12 15:45:48 +08:00
阿里巴巴里的规范,知道多大就写多大,不知道就写 16
nothingistrue
2023-10-12 16:07:27 +08:00
指定初始值,对性能有好处。一是对于就三两个键值对的 Map ,可以指定一个小的值,减小空间浪费(不指定的话就是默认初始容量,好像是 100 )。二是对于可预估容量的大 Map ,直接初始化最大容量,能避免自动扩容的时间浪费。但如果是容量动态增缩,或者最大容量不可预估的 Map ,那就不要指定了,大概率造成负优化。

这个值,填写的是预估最大容量,这是动态值,当然不能填常量。不过一般也没必要刻意去区分 1 、3 、10 、20 这些小容量,小容量的可以统一填 16 ,这个可以造个常量。

这是性能调优的东西,并且是小优化。这种东西最多作为提示出现,连警告都不能算,这都给拦截代码提交,那是绝对的脑残。
nothingistrue
2023-10-12 16:09:33 +08:00
这个脑残又很严重的后果。为了过代码扫描,程序员绝对无脑填 16 ,导致本来不用扩容的 50 容量 Map ,反而多了一次扩容。
tianshuang
2023-10-12 23:43:37 +08:00
大部分场景下不需要,应该把精力花在引起性能瓶颈的地方。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/981266

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX