前面介紹了arrylist的原理和使用方法,本篇來介紹list家族中另乙個重要成員——linkedlist。linkedlist和arraylist一樣是集合list的實現類,雖然較之arraylist,其使用場景並不多,但同樣有用到的時候,那麼接下來,我們來認識一下它。
通過idea生成linkedlist的繼承關係圖,可以清晰的看出linkedlist的繼承關係。如下圖
首先,我們先看一下linkedlist這個類的屬性。
transientlinkedlist類的主要屬性有size,first和last。其中,size標識節點的個數,first指向鍊錶的頭節點,last指向鍊錶的尾節點。再看一下節點的定義,也就是node類,可以看出,linkedlist其實就是乙個雙向鍊錶。int size = 0;
/*** pointer to first node.
* invariant: (first == null && last == null) ||
* (first.prev == null && first.item != null)
*/transient nodefirst;
/*** pointer to last node.
* invariant: (first == null && last == null) ||
* (last.next == null && last.item != null)
*/transient nodelast;
private
static
class node
}
linkedlist的提供兩個建構函式。乙個無參建構函式,乙個引數未集合建構函式。
無參建構函式很簡單,只是建立了乙個linkedlist的物件。
public有參建構函式首先呼叫無參建構函式新建乙個物件,然後再呼叫addall將集合新增進去。linkedlist()
public linkedlist(collection extends e>c)再來看一下addall方法,我將相關的方法都粘了過來,逐一進行分析public boolean addall(collection extends e>c)
return
addall(size, c);
}public boolean addall(int index, collection extends e>c)
else
for(object o : a)
if (succ == null
) else
size +=numnew;
modcount++;
return
true;}
private
void checkpositionindex(int
index)
private boolean ispositionindex(int
index)
nodenode(int index) else首先呼叫addall的過載方法,可以再某個位置新增節點,傳入size,此時size的值為0。首先呼叫 checkpositionindex(index)方法,然後將要得到要插入位置的前置節點和後置節點,最後插入元素,詳細看**注釋。}
這裡只說一下插入和刪除,他們牽涉到引用的變動
linkedlist主要提供addfirst
、addlast
、add
、addall
等方法來實現元素的新增。下面我們一一來看:public
void
addfirst(e e)
private
void
linkfirst(e e)
add方法和addlast方法最後呼叫的都是乙個方法,總體思路一樣,只是牽涉到引用的指向。
public看了這幾個新增,通過下面這個圖來看一下吧boolean
add(e e)
public
void
addlast(e e)
void
linklast(e e)
這裡只說一下public e remove(int index)這個方法
public e remove(int通過下面這張圖就可以清楚的標識引用的變動了index)
e unlink(node
x)
else
if (next == null
) else
x.item = null
; size--;
modcount++;
return
element;
}
本篇對linkedlist的原理進行了分析,希望對大家有所幫助,接下來會對比一下arraylist和linkedlist,希望小夥伴們持續關注。
LinkedList底層原理
首先 linkedlist 是雙向列表。用於記錄集合的數量 transient intsize 0 集合的第一項 transient nodefirst 集合的最後一項 transient nodelast linkedlist類中有乙個內部私有類node,這個類就代表雙端鍊錶的節點node。這個類...
LinkedList的原理和方法介紹 使用
目錄 linkedlist底層是雙向鍊錶 變數 構造方法 public linkedlist public linkedlist collection c 常用方法,不討論最簡單的add和remove public void addfirst e e 在把元素新增在煉表頭 public void a...
ArrayList及LinkedList原始碼分析
jdk7的情況 建議在開發中使用帶引數的構造器 arraylist list new arraylist int capaity 這樣能夠減少擴容次數,從而提高效率。jdk8的情況 小總結jdk7中的arraylist中底層object陣列的建立類似於單例模式中的餓漢式,一呼叫建構函式就建立了乙個長...