LinkedList与ArrayList的区别及LinkedList源码分析

LinkedList与ArrayList

  • ArrayList有的方法LinkedList也有,执行结果一样,但底层和执行过程不一样。ArrayList底层是数组,执行list.add(2,3)时,需大量后移元素。LinkedList底层是双向链表,执行list.add(2,3)时,不需要大量后移元素,修改节点的指向即可。

  • LinkedList实现了 Deque接口,而Deque继承了Queue,所以LinkedList有更多的方法,如:添加,删除,获取首尾元素的方法:list.addFirst();list.addLast();list.removeFirst();list.removeLast();list.getFirst();list.getLast();

  • 大量按照索引查询,遍历时使用ArrayList,较多的添加删除操作使用LinkedList

LinkedList源码

分析list.add()的代码流程:

public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
    transient int size = 0;

    transient Node<E> first;

    transient Node<E> last;
}
  public boolean add(E e) {
        linkLast(e);
        return true;
    }
void linkLast(E e) {
        final Node<E> l = last;
        final Node<E> newNode = new Node<>(l, e, null);
        last = newNode;
        if (l == null)
            first = newNode;
        else
            l.next = newNode;
        size++;
        modCount++;
    }
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;
        }
    }

LinkedList与ArrayList的区别及LinkedList源码分析

LinkedList与ArrayList的区别及LinkedList源码分析

上一篇:HDU-6968(DP,和DP)


下一篇:【剑指offer】58 - II. 左旋转字符串