Ctrl + 单机 进入ArrayList , 开始探秘。。。
开撸
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList 继承于AbstractList,实现了List接口,是一个长度可变的集合,提供了增删改查的功能。集合中允许null的存在。ArrayList类还是实现了RandomAccess接口,可以对元素进行快速访问。实现了Serializable接口,说明ArrayList可以被序列化,还有Cloneable接口,可以被复制。
// 初始容量-默认值
private static final int DEFAULT_CAPACITY = 10;
// 这个变量可以在无参构造器中看到
private static final Object[] EMPTY_ELEMENTDATA = {};
//可以看到,这里的elementData参数被transient 修饰,表示不会被序列
//化的一个,而ArrayList的本质结构也可以发现是对象数组
private transient Object[] elementData;
// 长度
private int size;
无参构造器
public ArrayList() {
super();
this.elementData = EMPTY_ELEMENTDATA;
}
有参构造器
一个int类型的参数,指定生成的list的数组长度,并对其传入的参数进行了一个校验,后面抛出了异常,异常的机制可以参考本栈的责任链模式那片文章了解
public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
}
集合作为参数,ArrayList的构造器
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
size = elementData.length;
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
}
ArrayList构造的时候,采用集合作为参数,首先对传入的集合
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
T[] copy = ((Object)newType == (Object)Object[].class)
? (T[]) new Object[newLength]
: (T[]) Array.newInstance(newType.getComponentType(), newLength);
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}