上文講解了arraylist的底層實現原理,感興趣的小夥伴可以去看下,本文重點討論linkedlist集合。
首先說下arraylist和linkedlist的區別:(相同點都是有序的~)
① arraylist底層資料結構是動態陣列,linkedlist底層資料結構是雙向鍊錶。
② 查詢或者修改的時候,arraylist比linkedlist的效率更高,因為linkedlist是線性的基於鍊錶的資料儲存方式,所以需要移動指標從前往後依次查詢,即使原始碼中(下面會詳細說明)用了二分法,但是效率還是不如arraylist底層基於陣列,直接通過索引定位,效率極快。
③ 增加或者刪除的時候,linkedlist比arraylist的效率更高,因為arraylist是陣列,所以在其中進行增刪操作時,會對操作點之後所有資料的下標索引造成影響,需要進行資料的移動,而linkedlist只需要修改prev和next的指標引用即可。
綜上所述,arraylist適用於查詢或者修改比較多的場景,linkelist適用於查詢/修改較少,增加和刪除較多的場景。
純手寫linkedlist原始碼(白話文分析):
package com.example;
public class mylinkedlistimplements mylist
@override
public boolean add(e e)
@override
public e get(int index)
/** 【刪除原理:改變相互引用的指標】
* 步驟3:當前要刪除node節點/物件,所有屬性置為null,等待gc**
* @param index
* @return
*/@override
public e remove(int index)
/*** 新增我們的節點,作為最後乙個元素
* @param e
*/void linklast(e e)
/*** 鍊錶:其實可以理解為全表掃瞄(折半查詢)
* 陣列:直接通過索引定位,效率極快
* @param index index小於折半值,從頭開始查;index大於折半值,從尾開始查
* @return
*/nodenode(int index)
return x;
} else
return x;
}// 1-10 | 3 1-3 | 7 10-7
}/**
* 刪除節點,重新連線鍊錶
* @param x 當前刪除的node節點
* @return
*/e unlink(mylinkedlist.nodex) else
if (next == null) else
// 當前刪除的節點的元素值置為空
x.item = null;
size--;
return element;
}/**
* 鍊錶中的節點
* @param */
private static class node
node(e element)
public void setprev(nodeprev)
public void setnext(nodenext)
}private void checkelementindex(int index)
}private boolean iselementindex(int index)
public static void main(string args)
}
在上述main方法最後一行打個斷點,debug啟動,會發現node1和node2是相互引用的,驗證了linkedlist底層是基於雙向鍊錶。
此時,測試一下我們手寫的linkeslist:
package com.example.test;
import com.example.mylinkedlist;
public class test001
}
會發現,當我們刪除索引為1的元素,那麼003則會替代002的位置,該測試把我們的增,刪,查都用上了,改的話無非就是先呼叫node(即查詢指定索引對應的node節點),然後替換node的item屬性為新元素即可。
【總結】
鍊錶資料底層原理實現:雙向鍊錶頭尾相接
① 在底層中使用靜態內部類node節點存放節點元素
② add原理是如何實現? 答案: 一直在鍊錶之後新增
③ get原理:採用折半查詢 範圍查詢定位node節點
④ remove原理:改變相互引用的指標
LinkedList集合整理
jdk1.6以後的新特性 addfirst offerfirst addlast offerlast getfirst peekfirst getlast peeklast removefirst pollfirst removelast polllast jdk1.6以後,刪除或獲取元素時,如果列...
泛型集合 LinkedList
using system using system.collections.generic using system.linq using system.text using system.collections namespace linkedlist class program static v...
集合 list 迭代 linkedList
集合類 定義 用於儲存物件最常用的一種方式 集合類與陣列的比較 陣列和集合類同是容器,陣列雖然也可以儲存物件,但是長度固定,而集合類為可變長度,陣列可儲存基本資料型別,集合只存放物件,而且可以存放不同型別的物件。集合框架中的常用介面 collection 介面有兩個子介面 list 列表 set 集...