增、刪、改、查
tostring
linkedlist並不是通過陣列實現的,而是一種雙向鍊錶的結構來實現。這種結構的特點為:查詢效率低,增刪效率高,執行緒不安全
所有,增加或刪除元素較多時,我們選用linkedlist。
linkedlist是通過雙向鍊錶實現的,首先,我們得了解雙向鍊錶。雙向鍊錶的結構如下圖:
鍊錶是乙個乙個的節點組成的,在雙向鍊錶中,它的每個資料節點中都有兩個指標,分別指向前乙個節點和後乙個節點。 所以,從雙向鍊錶中的任意乙個節點開始,都可以很方便地找到所有節點。
雙向鍊錶中的節點實現原始碼如下:
private
static
class
node
}
一般使用無引數的構造器,因為鍊錶並沒有大小的限制,在linkedlist類中有如下宣告:
transient
int size =0;
//用於記錄元素個數,初始值是0
transient node
first;
//前指標,用於記錄第乙個節點
transient node
last;
//後指正,用於記錄最後乙個節點
容器嘛,用來儲存資料的,那就離不開」增、刪、改、查「這裡四個字。那就來逐一看linkedlist是如何實現實現的。
public
boolean
add(e e)
void
linklast
(e e)
雙向鍊錶的刪除,其實就是移除,將節點移除鍊錶。如果是移除中間的節點,則:被移除節點前乙個節點的後指標,指向被移除節點的後乙個節點;被移除節點後乙個節點的前指標,指向被移除節點的前乙個節點。原始碼如下:
public e remove
(int index)
e unlink
(node
x)else
if(next == null)
else
x.item = null;
//被移除節點的儲存內容置空
size--
;//用於記錄元素個數的size減1
modcount++
;return element;
}
linkedlist的增刪容易,改和查就比較麻煩了(主要是執行次數上公升),需要迴圈多次來找到指定位置,再進行操作。原始碼如下:
public e set
(int index, e element)
node
node
(int index)
else
}
「改」中,其實就是先查後改的,所有和改類似,查的原始碼如下:
public e get
(int index)
node
node
(int index)
else
}
原始碼與arraylist大致相似,主要是對雙相鍊錶的遍歷,我這裡手寫了遍歷,便於理解:
@override
public string tostring()
sb.setcharat
(sb.
length()
-1,']');
return sb.
tostring()
;}
Java LinkedHashMap類原始碼解析
linkedhashmap繼承了hashmap,他在hashmap的基礎上增加了乙個雙向鍊錶的結構,鍊錶預設維持key插入的順序,重複的key值插入不會改變順序,適用於使用者需要返回乙個順序相同的map物件的情況。還可以生成access order順序的版本,按照最近訪問順序來儲存,剛被訪問的結點處...
Java LinkedHashMap類原始碼解析
linkedhashmap繼承了hashmap,他在hashmap的基礎上增加了乙個雙向鍊錶的結構,鍊錶預設維持key插入的順序,重複的key值插入不會改變順序,適用於使用者需要返回乙個順序相同的map物件的情況。還可以生成access order順序的版本,按照最近訪問順序來儲存,剛被訪問的結點處...
類實現之LinkedList
include class node node int num num num node class linkedlist linkedlist void add int num node pnew new node num pnew pre pcur pcur next pnew void add...