這篇部落格算不上對linkedlist類的詳解,我只能把自己淺薄的知識分享出來了。
雙向鍊錶
jdk1.6的時候是entry結點實現的,jdk1.7開始改用node結點實現。
那這兩個有什麼不同呢,**據說**是1.7優化的。說是從迴圈鍊錶變成 了非迴圈鍊錶。
因為linkedlist 是基於鍊錶的,因此不像arraylist需要擴容機制。
查詢操作源**:
public e get(int
index)
nodenode(int
index) else
}
可以看出他根據index和size比較來決定從哪邊開始遍歷才能更快的查詢到該下標的元素。而不是直接訪問到該元素。比起arraylist內部直接對陣列下標訪問效能確實差一截。
增刪操作源**:
以add(int index, e element)方法為例
public
void add(int
index, e element)
checkpositionindex(index);//函式如下,這是乙個檢查異常的函式,我們寫程式的時候可以借鑑這種思想,但是他現在不是我們考慮的重點。
private
void checkpositionindex(int
index)
if (index == size) //如果下標是最後的
linklast(element); //直接新增到最後
else //如果下標不是最後的
linkbefore(element, node(index)); //執行這個新增函式
linkbefore(e e, node succ)函式如下:
void linkbefore(e e, nodesucc)
pred 是當前要插入位置節點的上乙個節點,即圖中的第乙個節點。newnode 將要插入的物件包裝成node節點(指定上乙個節點為pred,下乙個節點為node()返回值succ)。
接著將succ節點的上乙個節點指定為我們的新節點newnode。那麼肯定會有邏輯將pred的next設定為newnode。
果然,最後做了乙個判斷,如果pred為null,說明succ節點為第乙個有資料的節點,就將生成的新節點newnode置為first節點,否則指定上個節點的下乙個節點為生成的新節點,即pred.next = newnode。
這樣就完成了整個鍊錶資料插入過程。顯然是不同於arraylist那樣地進行陣列複製。
ps:上面這一段是我抄的,原始碼我看不懂。。。。。
**請見下面的參考資料。
1、獲取鍊錶的第乙個和最後乙個元素
system.out.println(「鍊錶的第乙個元素是 : 」 + llist.getfirst());
system.out.println(「鍊錶最後乙個元素是 : 」 + llist.getlast());
2、從鍊錶生成子表
list subl = llist.sublist(1, 4);
3、新增元素:新增單個元素
如果不指定索引的話,元素將被新增到鍊錶的最後.
public boolean add(object element)
public boolean add(int index, object element)
也可以把鍊錶當初棧或者佇列來處理:
public boolean addfirst(object element)
public boolean addlast(object element)
addlast()方法和不帶索引的add()方法實現的效果一樣.
4、刪除元素
list.removefirst();
list.removelast();
5、使用鍊錶實現棧效果 (先進後出)
class stackl
public object top()
public object pop()
} 6、使用鍊錶來實現佇列效果(先進先出)
class queue
public object get()
public boolean isempty()
} 7、刪掉所有元素:清空linkedlist
llist.clear();
8、arraylist和linkedlist之間的轉換
通過構造方法互換
linkedlist linkedlist = new linkedlist(arraylist);
arraylist arraylist = new arraylist(linkedlist);
9、確認鍊錶是否存在特定元素
llist.contains(「4」);
1、linkedlist適合增刪,不適合查詢。
2、linkedlist不同步
3、linkedlist本質是雙向鍊錶
參考資料:
java原始碼分析08 LinkedList
喜歡乙個人,就會喜歡她的一切嗎?今天,我們來看下linkedlist的結構。linkedlist內部其實是雙向鍊錶實現的,而且擁有輪詢以及出棧的功能。增刪改查 public boolean add e e void linklast e e 每次增加新的元素,都是在鍊錶末尾加上,注意當前時刻的末尾節...
Java資料結構詳解(四) LinkedList
返回鍊錶的邏輯大小 transient int size 0 頭部節點 transient nodefirst 尾部節點 transient nodelast 一,無參構造器 public linkedlist 二,有引數的構造器 public linkedlist collection c add...
Java資料結構之手寫LinkedList
linkedlist的實現本質為乙個雙向鍊錶,下面是簡單的實現增刪改查 public class linkedlist public void add e e public void change int index,e e nodetarget node index target.item e 刪...