`

newHashMapWithExpectedSize

    博客分类:
  • java
 
阅读更多
newHashMapWithExpectedSize  VS  new HashMap
demo如下:
package test;

import com.google.common.collect.Maps;

import java.util.HashMap;
import java.util.Map;

/**
 *  测试map的两种new方式
 */
public class TestHashMap {
    public static void main(String[] args) {
        /**
         * Maps 用的 guava-27.0.1-jre.jar中的类
         * map1的初始容量设置3,实际上map它的初始容量是8,原理是:
         * expectedSize / 0.75F + 1.0F  与
         *         int n = cap - 1;
         *         n |= n >>> 1;
         *         n |= n >>> 2;
         *         n |= n >>> 4;
         *         n |= n >>> 8;
         *         n |= n >>> 16;
         *         return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
         *  分析源码即可知道。
         */
        Map<Integer,Integer> map1 = Maps.newHashMapWithExpectedSize(3);
        /**
         * JDK8
         * map1的初始容量设置3,实际上map它的初始容量是4,原理是:
         *         int n = cap - 1;
         *         n |= n >>> 1;
         *         n |= n >>> 2;
         *         n |= n >>> 4;
         *         n |= n >>> 8;
         *         n |= n >>> 16;
         *         return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
         *
         *  把一个数转化成第一个比他自身大的2的幂   比3自身大的2的幂就是4
         */
        Map<Integer,Integer> map2 = new HashMap<>(3);
        /**
         * 结论 无论哪种用法,其实都是可以的,比较建议的是第一种,毕竟扩容次数少一些,不过内存上会有些损耗,
         * 如果你的场景对内存要求高,可以牺牲性能,用第二种,总之脱离场景谈用法都是耍流氓。
         */
    }
}


参考下阿里巴巴的开发手册中的定义


参考:HashMap容量为什么设置初始值为16?https://blog.csdn.net/l18848956739/article/details/85998121 解读的非常好
  • 大小: 102.3 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics