LinkedList继承自List,是一种常用的容器。虽然同为ArrayList和LinkedList同为List,但二者的实现方式完全不同,导致二者的性能和使用场景都有较大的不同,本文将从源码角度解析LinkedList。
LinkedList的类图关系如上图所示。简而言之,LinkedList是实现了可复制,可序列化的一种双向链表。虽然它同时实现了List和Deque接口,从内在基因上个人更倾向于将其归于双向队列。下面就从源码的角度看一看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;
}
}
// size of list
transient int size = 0;
/**
* Pointer to first node
*/
transient Node<T> first;
/**
* Pointer to lastnode
*/
transient Node<T> last;
这里列出了几个关键的变量。首先重中之重是Node,即LinkedList的结点。每一个LinkedList由一个一个的Node连接起来。Node由三部分组成,前驱指针指向前一个Node,后继指针指向后面的Node,结点元素存储值。其他几个变量从字面上也都很容易理解。
二 关键函数
1 构造函数
/**
* Constructs an empty list.
*/
public LinkedList() {
}
/**
* Constructs a list containing the elements of the speci