国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

JDK源碼閱讀——LinkedList

2019-11-11 02:55:28
字體:
來源:轉載
供稿:網友

作為數據結構中最基礎的兩種結構,數組與鏈表,在java中都有對應的實現——ArrayList與LinkedList。本文主要分析一下LinkedList中的比較重要的源碼。 LinkedList是實現了List與Deque的雙向鏈表。他不是線程安全的,在多線程情況下需要用戶手動保證線程安全性。系統推薦使用下面的方法來保證線程安全。

List list = Collections.synchronizedList(new LinkedList(...));

Field

transient int size = 0; //頭結點 transient Node<E> first; //尾節點transient Node<E> last;//節點本身是一個內部類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; } }

構造器

//構造一個普通的新鏈表對象 public LinkedList() { } //構造一個新鏈表,并將入參集合append到新鏈表中 public LinkedList(Collection<? extends E> c) { this(); addAll(c); }//append的核心代碼在這里public boolean addAll(int index, Collection<? extends E> c) { checkPositionIndex(index); Object[] a = c.toArray(); //需要新增的結點個數 int numNew = a.length; if (numNew == 0) return false; //聲明頭結點與尾節點 Node<E> pred, succ; //從尾部開始appedn if (index == size) { succ = null; pred = last; } else { //從中間開始append,如圖1 succ = node(index); pred = succ.prev; }

圖1

for (Object o : a) { @SuppressWarnings("unchecked") E e = (E) o; Node<E> newNode = new Node<>(pred, e, null); if (pred == null) first = newNode; else pred.next = newNode; pred = newNode; }

上述循環的作用就是鏈表的插入操作,如圖2。不停的移動pred,把輸入的集合全都append到鏈表尾部。 圖2

if (succ == null) { last = pred; } else { pred.next = succ; succ.prev = pred; } size += numNew; modCount++; return true; }

圖3


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 田林县| 台东县| 芦溪县| 长岭县| 申扎县| 错那县| 高雄市| 青铜峡市| 杭锦后旗| 六安市| 宁阳县| 涿鹿县| 驻马店市| 利辛县| 静宁县| 海口市| 南城县| 横峰县| 庆云县| 太康县| 荔波县| 崇阳县| 东方市| 鹤峰县| 会昌县| 临沭县| 孝义市| 格尔木市| 游戏| 日喀则市| 台北市| 蓬莱市| 交城县| 旌德县| 高邑县| 濉溪县| 盐山县| 五台县| 苏州市| 怀宁县| 彭水|