ArrayList基本概念
ArrayList是一个数组实现的列表,容量自动增长,线程不安全。
RandomAccess接口,用于标记当前类是可以随机访问的,当一个类标记了RandomAccess接口,那么表明该类使用for循环遍历效率更高,如果没用RandomAccess标记,则使用迭代器遍历效率更高。
Cloneable接口,即覆盖了函数clone(),能被克隆。
Serializable接口,支持序列化,能通过序列化去传输。
ArrayList属性
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{ //序列化id
private static final long serialVersionUID = 8683452581122892189L;
//初始化默认容量
private static final int DEFAULT_CAPACITY = 10;
//空对象
private static final Object[] EMPTY_ELEMENTDATA = {};
//默认构造函数初始化空对象
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
//数据对象存放地方
transient Object[] elementData; // non-private to simplify nested class access
//列表长度
private int size;
//列表最大长度 2147483639
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
}
ArrayList构造函数
无参构造函数
/**
* 初始化elementData为空数组,elementData长度为0,size为0,第一次add时候,扩展elementData为默认长度10
*/
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
int构造函数
public ArrayList(int initialCapacity) {
//大于0初始化数组为int参数
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) { //参数为0,初始化空数组
this.elementData = EMPTY_ELEMENTDATA;
} else { //小于0 异常
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
Collection对象的构造函数
public ArrayList(Collection<? extends E> c) {
//collection对象转换成数组,将数组的地址的赋给elementData
//这里执行的简单赋值时浅拷贝
elementData = c.toArray();
//elementData长度赋值给size,并且size如果不等于0
if ((size = elementData.length) != 0) {
//执行Arrays.copy方法,把collection对象的内容copy到elementData中。
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
// size为0,将空数组赋值给elementData
this.elementData = EMPTY_ELEMENTDATA;
}
}