HashMap源码--(二)构造器

HashMap源码–(二)构造器

HashMap有4个构造器,主要分为两种,一种是创建空元素的HashMap,一种是传入一个Map,将Map中的元素复制成一个新的HashMap。
无论是哪个构造器都需要先给容量、加载因子和Entry数组。

1、指定容量和加载因子HashMap(int initialCapacity, float loadFactor)

    /**
     * 指定容量和加载因子的空元素构造器
     * 
     * @param  initialCapacity 容量
     * @param  loadFactor     加载因子
     * @throws IllegalArgumentException 当容量为负数或加载因子为非正
     * 数时抛异常
     */
    public HashMap(int initialCapacity, float loadFactor) {
     //指定容量为负时抛非法数据异常
        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);
        // 查找大于等于initialCapacity的2的幂指数
        int capacity = 1;
        while (capacity < initialCapacity)
            capacity <<= 1;
        //加载因子
        this.loadFactor = loadFactor;
        //阈值
        threshold = (int)(capacity * loadFactor);
        //Entry数组
        table = new Entry[capacity];
        //初始化,暂时为空方法
        init();
    }

这个构造器是基础构造器,其他的构造器都是用它来初始化属性。

2、指定容量HashMap(int initialCapacity)

    /**
     * 容量指定、加载因子默认0.75的空元素构造器
     *
     * @param  initialCapacity 指定容量
     * @throws IllegalArgumentException 容量为负抛异常
     */
    public HashMap(int initialCapacity) {
        this(initialCapacity, DEFAULT_LOAD_FACTOR);
    }

同之前构造器一样,都是指定容量和加载因子。

3、默认构造器HashMap()

    /**
     * 默认构造器,采用默认的容量(16)和默认的加载因子(0.75)。
     */
    public HashMap() {
        //加载因子
        this.loadFactor = DEFAULT_LOAD_FACTOR;
        //阈值
        threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
        //Entry数组
        table = new Entry[DEFAULT_INITIAL_CAPACITY];
        init();
    }

4、传入Map的构造器HashMap(Map<? extends K, ? extends V> m)

    /**
     * 传入Map,复制Map创建一个新的HashMap,容量为16和
     * m.size()/DEFAULT_LOAD_FACTOR(0.75)的最大值,
     * 加载因子为默认加载因子(0.75) 
     * @param m 指定的Map
     * @throws NullPointerException Map为空时抛异常
     */
    public HashMap(Map<? extends K, ? extends V> m) {
    //容量为m.size()/默认加载因子和默认容量的大者
        this(Math.max((int) (m.size() / DEFAULT_LOAD_FACTOR) + 1, DEFAULT_INITIAL_CAPACITY), DEFAULT_LOAD_FACTOR);
        //将Map全部添加到HashMap中
        putAllForCreate(m);
    }
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页