欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HashMap 初始化(1.7)

程序员文章站 2022-06-04 19:22:43
...

size

size表示HashMap中存放KV的数量(为链表和树中的KV的总和)。

capacity

capacity译为容量。capacity就是指HashMap中桶的数量。默认值为16。一般第一次扩容时会扩容到64,之后好像是2倍。总之,容量都是2的幂

    /**
     * The default initial capacity - MUST be a power of two.
     */
    static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

loadFactor

loadFactor译为装载因子。装载因子用来衡量HashMap满的程度。loadFactor的默认值为0.75f。计算HashMap的实时装载因子的方法为:size/capacity,而不是占用桶的数量去除以capacity。

    /**
     * The load factor used when none specified in constructor.
     */
    static final float DEFAULT_LOAD_FACTOR = 0.75f;

threshold

threshold表示当HashMap的size大于threshold时会执行resize操作。 
threshold=capacity*loadFactor

    /**
     * The next size value at which to resize (capacity * load factor).
     */
    int threshold;

 

HashMap map = new HashMap();

1.7的hashmap初始化一共有三个构造函数:

    public HashMap(int initialCapacity, float loadFactor) {
        //如果桶长度<0,抛出异常。
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal initial capacity: " +
                                               initialCapacity);
        //如果长度>最大长度,长度为最大长度。
        if (initialCapacity > MAXIMUM_CAPACITY)
            initialCapacity = MAXIMUM_CAPACITY;
        if (loadFactor <= 0 || Float.isNaN(loadFactor))
            throw new IllegalArgumentException("Illegal load factor: " +
                                               loadFactor);

        //此时并不会创建容器,因为没有 传具体值
        // 没设置扩容大小
        /**
         * 此时并不会创建容器,因为没有传具体值。
         * 当下次传具体值的时候,才会“根据这次的初始容量”,创建一个内部数组。
         * 所以此次的初始容量只是作为下一次扩容(新建)的容量。
         */
        threshold = initialCapacity;

        //该方法只在LinkedHashMap中有实现,主要在构造函数初始化和clone、readObject中有调用。
        init();
    }

    /**
     * Constructs an empty <tt>HashMap</tt> with the specified initial
     * capacity and the default load factor (0.75).
     *
     * @param  initialCapacity the initial capacity.
     * @throws IllegalArgumentException if the initial capacity is negative.
     */
    public HashMap(int initialCapacity) {
        //传入初始化参数,则调用按照初始化参数初始化hashmap
        this(initialCapacity, DEFAULT_LOAD_FACTOR);
    }

    /**
     * Constructs an empty <tt>HashMap</tt> with the default initial capacity
     * (16) and the default load factor (0.75).
     */
    public HashMap() {
        //默认的16和装载因子0.75
        this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR);
    }
    /**
     * 根据已有map对象生成一个hashmap,初始容量与传入的map相关,负载因子使用默认值
     * @param m Map对象
     */
    public HashMap(Map<? extends K, ? extends V> m) {
        //生成空数组,并指定扩容值
        this(Math.max((int) (m.size() / DEFAULT_LOAD_FACTOR) + 1, DEFAULT_INITIAL_CAPACITY), DEFAULT_LOAD_FACTOR);

        //由于此时数组为空,所以使用“扩容临界值”新建一个数组
        inflateTable(threshold);

        //将传入map的键值对添加到初始数组中
        putAllForCreate(m);
    }

 

转载于:https://my.oschina.net/zhangtuoDMU/blog/899010