java中的HashMap存入效率测试与初始化容量大小之间的关系

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Z__Sheng/article/details/89314730

1.这里是我做的测试代码

    public static void main(String[] args) {
    int initialSize = 10000000;
    //HashMap存入效率测试
    Long start1 = System.currentTimeMillis();
    Map<Integer,Integer> map = new HashMap<>();
    for (int i = 0; i < initialSize; i++) {
        map.put(i, i);
    }

    Long end1 = System.currentTimeMillis();
    logger.info("未初始化HashMap大小,存入一千万条数据耗时:" + (end1 - start1) + "毫秒");


    Long start2 = System.currentTimeMillis();
    Map map1 = new HashMap<>(initialSize / 2);
    for (int i = 0; i < initialSize; i++) {
        map1.put(i, i);
    }

    Long end2 = System.currentTimeMillis();
    logger.info("初始化HashMap为500W,存入一千万条数据耗时:" + (end2 - start2) + "毫秒");


    Long start3 = System.currentTimeMillis();
    Map map3 = new HashMap<>(initialSize);
    for (int i = 0; i < initialSize; i++) {
        map3.put(i, i);
    }

    Long end3 = System.currentTimeMillis();
    logger.info("初始化HashMap为1000W,存入一千万条数据耗时:" + (end3 - start3) + "毫秒");


}

结果是:
未初始化hashmap大小,使用默认容量为16,存入一千万条数据耗时:14596毫秒
初始化HashMap为500W,存入一千万条数据耗时:9156毫秒
初始化HashMap为1000W,存入一千万条数据耗时:9031毫秒

注:这个结果跟机器配置有关,建议分开来测试,,比较准确。

02:通过上述的测试用例可以看出,进行new hashmap对象的时候,进行设置一个合理的初始化容量是很有必须要的,可以帮助我们提升开发效率。

03:如果提前预测一个合理的容量大小值
大家知道,hashmap是有扩容机制的,当达到一定条件的时候,hashmap会进行自动扩容。假如说我们需要插入的数据量很大,又没有进行初始化一个合理容量,这时使用默认的16,会进行多次扩容。因为hashmap的建立是基于hash表来的,会进行多次重建hash表,这对性能损耗是非常大的,所以我们在每次new hashmap的时候,最好指定一下初始容量。那么我们如何预测一个合理的容量呢?
在阿里巴巴开发者手册中,有一个对初始容量的建议:在这里插入图片描述
具体为什么要使用这个公式,或者这个公式具有怎么样的权威性,jdk也会对初始容量大小进行改变,可以参考Holis写的一篇文章,https://mp.weixin.qq.com/s?__biz=MzI3NzE0NjcwMg==&mid=2650120877&idx=1&sn=401bb7094d41918f1a6e142b6c66aaac&chksm=f36bbf8cc41c369aa44c319942b06ca0f119758b22e410e8f705ba56b9ac6d4042fe686dbed4&scene=21#wechat_redirect。里面说的很详细。

05:当在日常写代码过程中,我们需要创建hashmap的时候,已知hashmap大小的时候,尽量使用这个公式算出初始容量大小,这对于我们提升代码效率也是一种方法。

猜你喜欢

转载自blog.csdn.net/Z__Sheng/article/details/89314730