共同点
ArrayList和LinkedList都实现了List接口
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
ArrayList
- ArrayList是基于数组来实现的。
- 数组,具备随机访问的能力。
LinkedList
- LinkedList是基于链表(双向链表)实现的
private static class Node<E> { E item; Node<E> next; Node<E> prev; Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; } }
读操作
- 如果现在访问第N个元素,ArrayList和LinkedList的时间复杂度分别是
- ArrayList:O(1)
- LinkedList:O(N)
- LInkedList在插入的时候:插入在首或尾,时间复杂度是O(1);8889插入到中间的话,时间复杂度还是O(N)
适用场景
- ArrayList:读多写少,需要随机访问的场景;查找和遍历的效率较高。
- LinkedList:写多读少;增加和删除的效率较高。
总结
- ArrayList是基于数组的,数组有随机访问的能力。但也有缺点,比如:固定长度,因此ArrayList的元素达到一定数量后,需要进行扩容。适用场景:读多写少。
- LinkedList是基于双向链表,链表由节点组成,链表长度是不固定的,不需要扩容操作。适用场景:写多读少。
- 不涉及扩容的话,除了头部增删元素,arraylist平均性能都要比LinkedList高。
- arraylist实现了randomAccess接口,说明可以随机访问。
- arraylist因为地址相邻遍历时能很好的利用CPU局部性原理。