提交代码被代码扫描工具拦截了
提示: [ HashMap ] 初始化时,尽量指定初始值大小
平时没这么写过,去 GitHub 搜索关键字,这么写的有但不多,可能百分之一吧
你们会怎么写 Map<X, T> map = new HashMap<> Map<X, T> map = new HashMap<initial>
如果写初始值怎么写,直接填写数字 还是定义一些全局的常量
1
zjp 2023-10-12 11:55:59 +08:00 via Android
全局常量不如不写
指定初始大小是为了尽量减少扩容次数不是为了抑制告警 |
2
TWorldIsNButThis 2023-10-12 12:01:38 +08:00 via iPhone
几乎没手动 new 过 hashmap
不过非要给某些固定的几个 key value new 的时候的确会装模作样的加个 capacity 如果是 Java 的话这个 capacity 是不算 load factor 的,你还得手动换算一下才能有想要的效果(不扩容) 高版本有帮你算好的 api |
3
Mystery0 2023-10-12 12:46:48 +08:00 via Android
如果以前预知大小的话,会写成对应的值,例如任何情况下都不会塞进去多于 100 的值,那就写 100 ;以及预知会很多数据但是不确定具体数据的时候,也会写一个差不多的数来避免后续频繁的扩容
|
4
Mystery0 2023-10-12 12:47:40 +08:00 via Android
@Mystery0 我该换一个输入法了.....
如果已经预知大小的话,会写成对应的值,例如任何情况下都不会塞进去多于 100 的值,那就写 100 ;已经预知会很多数据但是不确定具体数据的时候,也会写一个差不多的数来避免后续频繁的扩容 |
5
cslive 2023-10-12 15:45:48 +08:00
阿里巴巴里的规范,知道多大就写多大,不知道就写 16
|
6
nothingistrue 2023-10-12 16:07:27 +08:00
指定初始值,对性能有好处。一是对于就三两个键值对的 Map ,可以指定一个小的值,减小空间浪费(不指定的话就是默认初始容量,好像是 100 )。二是对于可预估容量的大 Map ,直接初始化最大容量,能避免自动扩容的时间浪费。但如果是容量动态增缩,或者最大容量不可预估的 Map ,那就不要指定了,大概率造成负优化。
这个值,填写的是预估最大容量,这是动态值,当然不能填常量。不过一般也没必要刻意去区分 1 、3 、10 、20 这些小容量,小容量的可以统一填 16 ,这个可以造个常量。 这是性能调优的东西,并且是小优化。这种东西最多作为提示出现,连警告都不能算,这都给拦截代码提交,那是绝对的脑残。 |
7
nothingistrue 2023-10-12 16:09:33 +08:00
这个脑残又很严重的后果。为了过代码扫描,程序员绝对无脑填 16 ,导致本来不用扩容的 50 容量 Map ,反而多了一次扩容。
|
8
tianshuang 2023-10-12 23:43:37 +08:00
大部分场景下不需要,应该把精力花在引起性能瓶颈的地方。
|