V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
worldqiuzhi
V2EX  ›  问与答

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

  •  
  •   worldqiuzhi · 2023-10-12 11:48:12 +08:00 · 888 次点击
    这是一个创建于 444 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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


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

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

    这是性能调优的东西,并且是小优化。这种东西最多作为提示出现,连警告都不能算,这都给拦截代码提交,那是绝对的脑残。
    nothingistrue
        7
    nothingistrue  
       2023-10-12 16:09:33 +08:00
    这个脑残又很严重的后果。为了过代码扫描,程序员绝对无脑填 16 ,导致本来不用扩容的 50 容量 Map ,反而多了一次扩容。
    tianshuang
        8
    tianshuang  
       2023-10-12 23:43:37 +08:00
    大部分场景下不需要,应该把精力花在引起性能瓶颈的地方。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2502 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 05:18 · PVG 13:18 · LAX 21:18 · JFK 00:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.