集合类图
初始化
//如果使用默认的构造函数的话,就会使用这个对象初始化
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
//如果使用 0 作为初始化容量的时候,ArrayList就会使用这个对象来初始化
private static final Object[] EMPTY_ELEMENTDATA = {};
//ArrayList的底层数据结构,只是一个对象数组,用于存放实际元素
//并且被标记为transient,也就意味着在序列化的时候此字段是不会被序列化的
transient Object[] elementData;
//直接使用DEFAULTCAPACITY_EMPTY_ELEMENTDATA来初始化
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
//当initialCapacity 为0的时候,则会使用EMPTY_ELEMENTDATA初始化
//适用于我们知道固定的大小的个数,直接使用这个可以避免后期的扩容
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
添加
//添加元素主要做的3件事情
//1.首先确保能够将希望添加到集合中的元素添加到集合中,即确保ArrayList的容量
//2.然后将数据添加到elementData中指定位置
//3.最后将集合中的实际个数+1
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
查询
public E get(int index) {
//检查索引释放合法
rangeCheck(index);
//取值
return elementData(index);
}
删除
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work
return oldValue;
}