ArrayList与LinkedList

ArrayList和LinkedList都是实现了List接口的容器类,用于存储一些列引用对象。只观察功能,它们都可以对元素进行增删改查操作,那它们的区别有哪些呢?下面来说一下

实现原理

ArrayList是基于数组结构实现的,LinkedList是基于链表结构实现的。

ArrayList的源码:

  private static final Object[] EMPTY_ELEMENTDATA = {};

    /**
     * Shared empty array instance used for default sized empty instances. We
     * distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when
     * first element is added.
     */
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

    /**
     * The array buffer into which the elements of the ArrayList are stored.
     * The capacity of the ArrayList is the length of this array buffer. Any
     * empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
     * will be expanded to DEFAULT_CAPACITY when the first element is added.
     */
    transient Object[] elementData; // non-private to simplify nested class access

LinkedList的源码:

transient Node<E> first;

    /**
     * Pointer to last node.
     * Invariant: (first == null && last == null) ||
     *            (last.next == null && last.item != null)
     */
    transient Node<E> last;

    /**
     * Constructs an empty list.
     */

Get()方法获取指定元素

ArrayList集合中使用get()方法获取元素是通过直接读取下标实现的,复杂度为O(1)。而LinkedList中get()方法需要从头结点开始依次遍历,复杂度为O(n)

remove(index)方法删除元素

ArrayList中被删除的元素后面的元素需要逐个移动,复杂度为O(n)。LinkedList直接指针指向操作,复杂度O(1)

存储空间

ArrayList在使用的时候默认的初始化对象数组的大小长度为10,如果空间不足则会采用2倍的形式进行容量的扩充,如果保存大数据量的时候有可能造成垃圾的产生和性能的下降,但是这个时候可以使用LinkedList保存

应用场景

ArrayList使用在查询比较多,但是插入和删除比较少的情况,而LinkedList用在查询比较少而插入删除比较多的情况

原文地址:https://www.cnblogs.com/wulianjie/p/12393126.html