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

网友投稿 270 2022-06-14


深入剖析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型构造方法

源码剖析

/**

* 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 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类型的数组,如果不是,则进行复制;

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:深入剖析ArrayList的底层源码-常用方法及其源码剖析(arraylist源码分析)
下一篇:深入剖析ArrayList的底层源码-ArrayList介绍及其源码剖析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~