目录
复杂度
时间复杂度:执行一个算法所消耗的时间。随着数据的不断增大,执行时间的一种演化趋势。
空间复杂度:执行一个算法所消耗的内存空间。
通过 ArrayList 看下数组增删改查时的时间复杂度。
//ArrayList底层就是一个数组
transient Object[] elementData;
//默认容量为10
private static final int DEFAULT_CAPACITY = 10;
Demo
初始化一个 ArrayList,添加三个元素,在第0个位置插入一个元素。
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(1);
list.add(1);
list.add(0,6);
}
增加元素
public void add(int index, E element) {
// 检测索引是否越界
rangeCheckForAdd(index);
// 增加数组容量
ensureCapacityInternal(size + 1); // Increments modCount!!
// 移动元素
System.arraycopy(elementData, index, elementData, index + 1, size - index);
// 插入元素
elementData[index] = element;
size++;
}
在第0个位置插入元素,之前的所有元素都要往后移。如果有一个元素,就向后移动一次,有n个元素就向后移动n此。
时间复杂度:1+2+...+n/n = n(n+1)/2n = n/2 + 1/2 。去除常数项和低阶项。插入的时间复杂度就是O(n)。
删除元素
和插入的思路是一样的。删除第一个元素,后面的n个元素就移动n次。
时间复杂度:O(n)
修改元素
修改元素直接根据索引找到元素进行修改。一次就完成。
时间复杂度:O(1)
查询元素
根据索引一次定位到元素。一次就完成。
时间复杂度:O(1)
总结
- 尽量不要使用默认的构造函数,给一个确切值或大于预估值的容量。