数组是一种线性表的数据结构,是一个存储相同数据类型的集合,每个相邻元素的物理内存地址也相邻。
// 默认的初始化空间
private static final int DEFAULT_CAPACITY = 10;
// 默认的空元素数组
private static final Object[] DEFAULT_EMPTY_ELEMENTDATA = {};
// 元素数组缓冲区
private Object[] elementData;
// 元素个数
private int size;在我们初始化ArrayList的时候,如果指定了容量大小的话,那它就会创建一个指定容量大小的数组;如果没指定,默认会初始化一个空的数组,等add第一个元素的时候,容量扩充为10。
@Override
public boolean add(E e) {
// 确保最小容量
int minCapacity = size + 1;
if (elementData == DEFAULT_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
// 判断扩容操作
if (minCapacity > elementData.length) {
int oldCapacity = elementData.length;
// 扩容1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
// 例如添加单个元素但当前容量为 0,则直接使用minCapacity
if (newCapacity < minCapacity) {
newCapacity = minCapacity;
}
elementData = Arrays.copyOf(elementData, newCapacity);
}
// 添加元素
elementData[size++] = e;
return true;
} public E remove(int index) {
E oldValue = (E) elementData[index];
int numMoved = size - index - 1;
if (numMoved > 0) {
System.arraycopy(elementData, index + 1, elementData, index, numMoved);
}
elementData[--size] = null;
return oldValue;
} @Override
public E get(int index) {
return (E) elementData[index];
}
@Override
public String toString() {
return "ArrayList{" +
"elementData=" + Arrays.toString(elementData) +
", size=" + size +
'}';
} public static void main(String[] args) {
ArrayList<Object> list = new ArrayList<>();
list.add("01");
list.add("02");
list.add("03");
list.add("04");
list.add("05");
list.add("06");
list.add("07");
list.add("08");
list.add("09");
list.add("10");
list.add("11");
list.add("12");
System.out.println(list);
list.remove(9);
System.out.println(list);
}测试结果

数组、链表、栈、队列
删除元素是On,因为删除元素后,需要移动其他元素 获取元素是O1
ArrayList在首次添加元素之前,底层数组是一个空数组,在首次添加元素的时候自动扩容到10。
扩容是按原容量的1.5倍去扩容
完成扩容的步骤:
System.arraycopy(旧数组,旧数组的起始下标,新数组,新数组的起始下标,迁移的数据量)