在 ArrayList
的底层源码实现中,它使用了一个数组 elementData
来存储元素,当数组空间不够时会进行动态扩容ensureCapacity。除此之外,还实现了 add
、get
、set
、remove
等方法来对元素进行增加、获取、修改和删除操作。
public class ArrayList<E> implements List<E> {
private static final int DEFAULT_CAPACITY = 10;
private Object[] elementData;
private int size;
public ArrayList() {
this.elementData = new Object[DEFAULT_CAPACITY];
}
//在数组中添加元素
public boolean add(E e) {
ensureCapacity(size + 1);
elementData[size++] = e;
return true;
}
//数组的自动扩容
private void ensureCapacity(int minCapacity) {
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
int newCapacity = oldCapacity * 2;
if (newCapacity < minCapacity)
newCapacity = minCapacity;
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
//通过索引数获得集合中的元素
public void get(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
return (E) elementData[index];
}
//修改指定索引的元素
public void set(int index, E element) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
E oldValue = (E) elementData[index];
elementData[index] = element;
return oldValue;
}
//移除指定索引的元素,但索引后面的元素将依次前移一位
public void remove(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
E oldValue = (E) 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;
}
}