首页 > 编程语言 > Java Web开发 > 深入剖析ArrayList的底层源码-构造方法及其源码剖析
2020
03-12

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

深入剖析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类型的数组,如果不是,则进行复制;
否则,设置元素数组为空数组

扫码芷若 获取免费视频学习资料

编程学习

查 看2019高级编程视频教程免费获取