1.最大的不同点
最基本的不同点, ArrayList的底层数据结构是数组, LinkedList底层的数据结构是链表.
2.时间复杂度
由于数据结构不同, 两者的适用场景也有差异. ArrayList更适合随机查找,LinkedList更适合删除和添加.
ArrayList的get是根据下标查询, LinkedList是链表, 所以会遍历n个元素.
ArrayList在指定下标添加元素, 指定下标后的元素需要后移, 而LinkedList需要先遍历n个元素, 再修改指针指向
ArrayList添加元素的会有扩容的情况, 如果数据扩容, 那么本次添加操作的速度会变慢
时间复杂度对比:
ArrayList | LinkedList | |
---|---|---|
get(index) | O(1) | O(n) |
add(E) | O(1) | O(1) |
add(index, E) | O(n) | O(n) |
remove(index) | O(n) | O(1) |
3.接口实现
ArrayList和LinkedList都实现了List接⼝,但是LinkedList还额外实现了Deque接⼝,所以
LinkedList还可以当做队列来使⽤
//ArrayList接口
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable{}
//LinkedList接口
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable{}
LinkedList的接口继承了Deque
//Deque<E>接口
public interface Deque<E> extends Queue<E> {
void addFirst(E e);
void addLast(E e);
......
}
可以看出Deque是一个双端队列, LinkedList也同样可以作为一个双端队列使用.
4.空间
空间的使用, ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间.
使用场景
当操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能.
当操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了.