深入剖析ArrayList的底层源码-构造方法及其源码剖析

构造方法及其源码剖析

1. 带int类型的构造方法

源码剖析

 

/**

 * Constructs an empty list with the specified initial capacity.

 *

 * @param  initialCapacity  the initial capacity of the list

 * @throws IllegalArgumentException if the specified initial capacity

 *         is negative

 */

public ArrayList(int initialCapacity) {

// 如果初始容量大于0

    if (initialCapacity > 0) {

     // 新建一个初始容量大小的数组

        this.elementData = new Object[initialCapacity];

     // 如果初始容量为0

    } else if (initialCapacity == 0) {

     // 将EMPTY_ELEMENTDATA赋值给 elementData

        this.elementData = EMPTY_ELEMENTDATA;

    } else {

     // 否则初始容量小于0,则抛出异常 “非法的容量”

        throw new IllegalArgumentException(“Illegal Capacity: “+

                                           initialCapacity);

    }

}

 

总结:

 

如果传入参数也就是初始容量大于0,则新建一个初始容量大小的数组;

如果传入的参数初始容量等于0,将EMPTY_ELEMENTDATA赋值给 elementData;

如果传入的参数初始容量小于0,将抛出异常。

2. 无参构造方法

源码剖析

 

/**

 * Constructs an empty list with an initial capacity of ten.

 */

public ArrayList() {

// 没有指定初始容量,将成员变量elementData的值设为默认值

    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;

}

 

总结:

 

如果没有传入参数,则使用默认无参构建方法创建ArrayList对象。elementData是一个大小为0的空数组。

3. Collection<? extends E>型构造方法

源码剖析

 

/**

 * Constructs a list containing the elements of the specified

 * collection, in the order they are returned by the collection’s

 * iterator.

 *

 * @param c the collection whose elements are to be placed into this list

 * @throws NullPointerException if the specified collection is null

 */

public ArrayList(Collection<? extends E> c) {

// 将参数中的集合转换为数组,赋值给 elementData 

    elementData = c.toArray();

    // 如果数组的大小不等于 0

    if ((size = elementData.length) != 0) {

        // c.toArray might (incorrectly) not return Object[] (see 6260652)

        // 如果c.toArray()返回的数组类型不是Object[]类型的

        // 则利用Arrays.copyOf()创建一个大小为size的、类型为Object[]的数组, 并将elementData中的元素复制到新的数组中

        // 最后让elementData 指向新的数组

        if (elementData.getClass() != Object[].class)

            elementData = Arrays.copyOf(elementData, size, Object[].class);

    } else { // 否则设置元素数组为空数组

        // replace with empty array.

        this.elementData = EMPTY_ELEMENTDATA;

    }

}

 

总结:

 

将参数中的集合转换为数组,赋值给 elementData

.给size进行赋值,size代表集合元素数量。判断参数是否为空,如果数组的大小不等于 0,则进一步判断是否转化为Object类型的数组,如果不是,则进行复制;

否则,设置元素数组为空数组