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

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

JDK源碼閱讀——LinkedList

2019-11-11 01:45:05
字體:
來源:轉載
供稿:網友

作為數據結構中最基礎的兩種結構,數組與鏈表,在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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 桦南县| 黄山市| 孝昌县| 浠水县| 景谷| 革吉县| 漳州市| 岚皋县| 界首市| 金堂县| 油尖旺区| 涞源县| 厦门市| 米林县| 醴陵市| 张家界市| 雷山县| 信阳市| 延川县| 吉首市| 壶关县| 定安县| 锡林郭勒盟| 无为县| 健康| 营口市| 芜湖县| 南华县| 景泰县| 兴义市| 手机| 蛟河市| 朝阳县| 新津县| 张北县| 喜德县| 河北区| 莒南县| 静海县| 日照市| 宜城市|