首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java LinkedList 深度解析:常用 API、源碼剖析與棧隊列實現

     編輯:Java 綜合教學

Java LinkedList 深度解析:常用 API、源碼剖析與棧隊列實現

LinkedList 是 Java 集合框架中基於雙向鏈表實現的 List 接口實現類,同時實現了 Deque 接口,因此天然支持棧(LIFO)和隊列(FIFO)操作。本文將從類結構、常用 API、底層源碼、棧隊列實現四個維度全面解析。

類結構與構造方法

  • 繼承 AbstractSequentialList,實現 List、Deque、Cloneable、Serializable。
  • 兩個構造方法:LinkedList() 創建空鏈表;LinkedList(Collection<? extends E> c) 包含指定集合元素的鏈表。
  • 內部靜態類 Node<E> 定義雙向鏈表節點:item、next、prev。

核心 API 與代碼示例

LinkedList<String> sList = new LinkedList<>();
sList.add("zhangsan");        // 尾部添加
sList.add("lisi");
sList.add("wangwu");
sList.addFirst("jay");        // 頭部插入
sList.addLast("jhon");        // 尾部添加(同 add)
// 遍歷輸出
for (String name : sList) {
    System.out.println(name);
}
// 棧操作:先進後出
System.out.println(sList.removeFirst()); // 移除並返回首元素
sList.clear();
// 隊列操作:先進先出
System.out.println(sList.pollFirst());   // 獲取並移除首元素,空返回 null

底層源碼剖析:remove 與 unlink

remove(Object o) 遍歷鏈表查找目標節點,調用 unlink(Node<E> x) 斷開引用:

E unlink(Node<E> x) {
    final E element = x.item;
    final Node<E> next = x.next;
    final Node<E> prev = x.prev;
    if (prev == null) first = next;          // 刪除頭節點
    else { prev.next = next; x.prev = null; }
    if (next == null) last = prev;           // 刪除尾節點
    else { next.prev = prev; x.next = null; }
    x.item = null;                           // 幫助 GC
    size--; modCount++;
    return element;
}

圖解:刪除節點 b,將前驅 a 的 next 指向後繼 c,c 的 prev 指向 a,b 斷開引用置 null。

unlink 示意圖

實現棧與隊列

數據結構對應方法語義
棧 (LIFO)push() / pop() / peek()等同於 addFirst/removeFirst/getFirst
隊列 (FIFO)offer() / poll() / peek()等同於 addLast/removeFirst/getFirst

因實現 Deque,LinkedList 可直接作為高性能棧/隊列使用,無需同步開銷(非線程安全)。

總結

LinkedList 以雙向鏈表為底層,隨機訪問 O(n),但頭尾增刪 O(1),適合頻繁插入刪除、棧隊列場景。理解 unlink 斷開引用機制有助於排查內存洩漏與併發修改異常。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved