1. 程式人生 > 其它 >LinkedList實現分析(一)——LinkedList初探與物件建立

LinkedList實現分析(一)——LinkedList初探與物件建立

LinkedList是Java對資料結構中連結串列的一種實現。

與ArrayList相比:(1)它不支援隨機讀取資料,或者說在根據索引值去獲取元素時,需要對List進行遍歷,當然了jdk對遍歷元素做了優化,這點我們後面對講到。(2)往LinkedList中增加元素,不需要對原始list進行擴容,這樣可以避免在對list進行擴容的時候記憶體溢位。這個是什麼意思?由於ArrayList是基於陣列實現的,而在java中,陣列的容量是不可變的,因此當ArrayList在某個狀態的時候,它儲存資料的陣列已經飽和,如果此時再往ArrayList中增加一個元素,ArrayList會對底層陣列進行擴容:建立一個包含更大資料量的陣列,把老陣列的資料複製到新陣列,擴容的基本要求是把資料容量擴大到當前陣列的1.5倍(可以參考我的另外一篇文章[ArrayList實現分析(二)——常用操作](
https://www.jianshu.com/p/633b1780322f)),如果此時記憶體不足以容納1.5倍的資料,那麼就會出現記憶體溢位。而且當資料量很大的時候,每次老陣列複製資料到新陣列的時候,會消耗不少時間。個人在這裡推薦:如果業務中不涉及到大量的隨機讀取元素的操作,儘量使用LinkedList。

下面開始介紹一下LinkedList內部提供的幾個重要屬性:

//當前list的大小
transient int size = 0;
//list中第一個元素
transient Node<E> first;
//list中最後一個元素
transient Node<E> last;
//該屬性定義在LinkedList父類AbstractList中,表示當前list修改次數
//只要是對list進行過增刪改操作,modCount都會增加
protected transient int modCount = 0;

還有一個非常重要的內部靜態類Node,該類是時間儲存list資料元素的類,每當有新元素新增到LinkedList中的時候,會建立一個Node物件,LinkedList中的元素是通過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;
 }
 }

Node只提供一個構造方法,建立一個Node節點,需要提供三個引數: 插入的時候的上一個節點的指標,插入的元素,插入元素的後一個元素的指標,通常是在LinkedList的尾追加新元素,因此建立Node的時候,next通常賦值為null,表示插入的元素是放在整個LinkedList的尾部。

介紹完基本的屬性,下面看一下LinkedList提供了兩種構造方法:

//建立一個空的list
public LinkedList() {
}
//使用Collection物件建立list
public LinkedList(Collection<? extends E> c) {
 this();
 addAll(c);
}

由上面的原始碼可知,通過傳入一個Collection物件構造LinkedList時,它實際是通過呼叫addAll方法把Collection物件新增到一個空的LinkedList中。addAll方法後面具體再詳細介紹。下一篇文章,我們開始介紹LinkedList常用方法的實現。