先说结论:
ArrayList | LinkedList | |
---|---|---|
表尾插入 | 时间复杂度O(1) | 时间复杂度O(1) |
表中插入 | 平均时间复杂度为O(n/2)。 插入位置越靠近表头时间复杂度越大,最大能达到O(n)。 插入位置越靠近表尾时间复杂度越小,最小能达到O(1)。 但是因为使用了arraycopy赋值数组时间复杂度会小于理论值。 |
平均时间复杂度为O(n/4) 插入位置越接近中间时间复杂度越大 但是最大也只需O(n/2) 最小为O(1) |
表头插入 | 时间复杂度为O(n) | 时间复杂度为O(1) |
删除 | 平均时间复杂度为O(n/2)。 删除目标越靠近表头时间复杂度越大,最大能达到O(n)。 删除目标越靠近表尾时间复杂度越小,最小能达到O(1)。 但是因为使用了arraycopy赋值数组时间复杂度会小于理论值。 |
平均时间复杂度为O(n/4) 删除越接近中间时间复杂度越大 但是最大也只需O(n/2) 最小为O(1) |
修改 | 时间复杂度O(1) | 平均时间复杂度为O(n/4) |
根据索引查找 | 时间复杂度O(1) | 平均时间复杂度为O(n/4) |
总结:查找和修改偏多使用ArrayList,插入和删除偏多使用LinkedList。此外,时间复杂度都为O(1)时,ArrayList的表现更好。比如在表尾进行插入删除,两者时间复杂度都为O(1),但推荐使用ArrayList。LinkedList涉及到新建对象,效率更低一些。
下面是分析:
- 增
插入表尾:
ArrayList:
源码如下,size为数组长度。因此时间复杂度为O(1)。
public boolean add(E e) { ensur