HashMap源码--(二)构造器

来源:互联网 发布:怪物猎人ol mac 编辑:程序博客网 时间:2024/06/11 01:39

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);    }
原创粉丝点击