LinkedList概述
LinkedList是基於鏈表的list,與C++中的鏈表是相同的,它是一個雙向鏈表。先來看下LinkedList的定義:
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
LinkedList 實現了 List 接口,所以他具有List的所有操作。
LinkedList 實現 Deque 接口,即能將LinkedList當作雙端隊列使用。
底層存儲
//鏈表的頭結點
transient Node<E> first;
//鏈表的尾結點
transient Node<E> last;
下面來看下Node這個類的定義:
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;
}
}
每個結點都存儲了prev結點和next結點。這樣就使得所有的元素結點鏈接起來。
仔細看了下源碼,增刪操作與C++中鏈表的操作一致。這裏我們只簡單介紹下add操作,其他操作就不在這裏贅述了。
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++;
}
add操作即在鏈表尾部添加一個元素,看下上面linkLast的源碼很容易理解,首先new一個Node結點,他的prev結點是原先的last結點,然後再將原來的last結點的next結點設置爲當前new出來的結點。顯然當第一次進行此操作時,first和last結點都爲null,此時插入的新節點即是first結點也是last結點。
我們可以看到這裏也有一個modCount字段,他的作用和ArrayList中是一樣的。
由於LinkedList與C++鏈表的操作時一樣的,所以LinkedList就簡單介紹一下。下一篇我們主要介紹一下LinkedList與ArrayList的區別。