HashMap初始化容量

188 阅读2分钟

好久之前,代码审查的时候,或者看阿里巴巴规约的时候。就提出要给map设置初始值。可是要设置多少。怎么设置 ?

寻找答案

设置多少,口说无凭,你要拿出真正的证据来

于是找啊找,找到了 [程序新视界] juejin.cn/post/696916… 写的这篇文章

下面内容参考作者


如何验证扩容

很多朋友可能也想验证HashMap到底在什么时候进行扩容的,但苦于没有思路或方法。这里提供一个简单的方式,就是基于反射获取并打印一下capacity的值。

还是上面的示例我们改造一下,向HashMap中添加数据时,打印对应的capacity和size这两个属性的值。

public class MapTest {

    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>(4);
        map.put("username", "Tom");
        print(map);
        map.put("address", "Bei Jing");
        print(map);
        map.put("age", "28");
        print(map);
        map.put("phone", "15800000000");
        print(map);
    }

    public static void print(Map<String, String> map) {
        try {
            Class<?> mapType = map.getClass();
            Method capacity = mapType.getDeclaredMethod("capacity");
            capacity.setAccessible(true);
            System.out.println("capacity : " + capacity.invoke(map) + "    size : " + map.size());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
复制代码

其中print方法通过反射机制,获取到Map中的capacity和size属性值,然后进行打印。在main方法中,每新增一个数据,就打印一下Map的容量。

打印结果如下:

capacity : 4    size : 1
capacity : 4    size : 2
capacity : 4    size : 3
capacity : 8    size : 4
复制代码

发现什么?当第4个数据put进去之后,HashMap的容量发生了一次扩容。


更多详细内容查看作者文章

其中作者的一句话很有意义:

可能有朋友会问,要不要设置HashMap的初识值,这个值又设置成多少,真的有那么大影响吗?不一定有很大影响,但性能的优化和个人技能的累积,不正是由这一点点的改进和提升而获得的吗?

问题解决

作者并没有给出如果快速解决这个问题

推荐使用谷歌的工具包

//里面放几个预算就写几
 Maps.newHashMapWithExpectedSize(2);
 
 

具体 分析的这里就不做过多解释

总结

引用 程序新视界 的一句话

  • 性能的优化和个人技能的累积,不正是由这一点点的改进和提升而获得的吗?