Java LinkedList – Java 中的 LinkedList

Java LinkedList 是 List 和 Deque 接口的实现之一。它是经常使用的 List 实现类之一。它继承了 AbstractSequentialList,并实现了 List 和 Deque 接口。它是一个有序的集合,支持重复元素。它按照插入顺序存储元素。它支持添加空元素。它支持基于索引的操作。如果你想了解更多关于 List 的基础知识,请阅读这篇文章:Java List

文章简要目录

在这篇文章中,我们将讨论以下概念。

  • Java LinkedList
  • Java LinkedList 类图
  • Java LinkedList List 方法
  • Java LinkedList Deque 方法
  • Java LinkedList 基本示例
  • Java LinkedList 泛型
  • Java 数组转 LinkedList
  • Java LinkedList 转数组
  • Java LinkedList 实时用例
  • Java LinkedList 的内部表示
  • Java LinkedList 中的插入操作如何工作?
  • Java LinkedList 中的删除操作如何工作?
  • Java LinkedList 的 Deque 操作
  • Java SE 8:Java LinkedList 转 Stream
  • Java SE 9 LinkedList

Java LinkedList

在這一節中,我們將討論關於Java LinkedList的一些重要點:

  • Java LinkedList類是Java集合框架的一員。
  • 它是List和Deque接口的實現。
  • 在內部,它是使用雙向鏈表數據結構來實現的。
  • 它支持重複元素。
  • 它按照插入順序存儲或維護其元素。
  • 我們可以添加任意數量的null元素。
  • 它不是同步的,這意味着它不是線程安全的。
  • 我們可以使用Collections.synchronizedList()方法創建同步的LinkedList。
  • 在Java應用程序中,我們可以將其用作列表、堆棧或隊列。
  • 它不實現RandomAccess接口。因此,我們只能按順序訪問元素。它不支持隨機訪問元素。
  • 當我們嘗試從LinkedList中訪問元素時,根據該元素在LinkedList中的位置,搜索該元素是從開始還是從結尾開始。
  • 我們可以使用ListIterator來迭代LinkedList元素。
  • 從Java SE 8開始,我們可以將LinkedList轉換為Stream,反之亦然。
  • Java SE 9將添加幾個工廠方法來創建不可變的LinkedList。

Java LinkedList 類別圖

我們知道,Java LinkedList 是 List 實作類別之一。它也實作了 Deque。如下方的類別圖所示,它並不直接繼承自 AbstractList 類別,而是繼承自 AbstractSequentialList 類別。

Java LinkedList 列表方法

在這一節中,我們將討論一些有用且經常使用的 Java LinkedList 方法。以下方法是從 List 或 Collection 介面繼承而來:

  1. int size(): 獲取列表中元素的數量。
  2. boolean isEmpty(): 檢查列表是否為空。
  3. boolean contains(Object o): 如果列表包含指定的元素則返回 true。
  4. Iterator iterator(): 返回列表中元素的迭代器,按照正確的順序。
  5. Object[] toArray(): 返回包含列表中所有元素的陣列,按照正確的順序。
  6. boolean add(E e): 將指定的元素附加到列表的末尾。
  7. boolean remove(Object o): 從列表中刪除第一個出現的指定元素。
  8. boolean retainAll(Collection c):保留此列表中包含在指定集合中的元素。
  9. void clear():從列表中刪除所有元素。
  10. E get(int index): Returns the element at the specified position in the list.
  11. E set(int index, E element): Replaces the element at the specified position in the list with the specified element.
  12. ListIterator listIterator():返回列表中元素的列表迭代器。
  13. List subList(int fromIndex, int toIndex):返回列表中指定fromIndex(包括)和toIndex(不包括)之间部分的视图。返回的列表由此列表支持,因此在返回的列表中进行的非结构性更改会反映在此列表中,反之亦然。

Java LinkedList Deque 方法

以下方法特定于从Deque接口继承的LinkedList类:

  1. void addFirst(E e):在此列表的开头插入指定的元素。
  2. void addLast(E e):在此列表的末尾插入指定的元素。
  3. E getFirst(): Retrieves, but does not remove, the first element of this list. This method differs from peekFirst only in that it throws an exception if this list is empty.
  4. E getLast(): Retrieves, but does not remove, the last element of this list. This method differs from peekLast only in that it throws an exception if this list is empty.
  5. E remvoeFirst(): Removes and returns the first element from this list.
  6. E removeLast(): Removes and returns the last element from this list.
  7. boolean offerFirst(E e):在此列表的前面插入指定的元素。
  8. boolean offerLast(E e):在此列表的末尾插入指定的元素。
  9. E pollFirst(): Retrieves and removes the first element of this list, or returns null if this list is empty.
  10. E pollLast(): Retrieves and removes the last element of this list, or returns null if this list is empty.
  11. E peekFirst(): Retrieves, but does not remove, the first element of this list, or returns null if this list is empty.
  12. E peekLast(): Retrieves, but does not remove, the last element of this list, or returns null if this list is empty.

Java LinkedList 基本示例

在這一節中,我們將討論 Java LinkedList 的基本示例。在接下來的幾節中,我們將探討一些更有用的操作。示例:

import java.util.LinkedList;
import java.util.List;

public class LinkedListDemo 
{
  public static void main(String[] args) 
  {
	List names = new LinkedList();
	names.add("Rams");
	names.add("Posa");
	names.add("Chinni");
        names.add(2011);
			
	System.out.println("LinkedList content: " + names);
	System.out.println("LinkedList size: " + names.size());
  }
}

輸出:

LinkedList content: [Rams, Posa, Chinni, 2011]
LinkedList size: 4

這裡我們創建了一個 LinkedList 對象並添加了 4 個項目。正如我們所討論的,LinkedList.size() 方法用於獲取列表中的元素數量。注意: 在不使用泛型的情況下,Java LinkedList 支持異類元素。然而,不建議在沒有泛型的情況下使用集合。讓我們在接下來的部分中通過一個簡單的示例來探索 Java 泛型的優點和用法。

Java LinkedList 泛型

在這一節中,我們將討論如何在 Java LinkedList 中使用泛型。正如我們所知,Java 泛型對於編寫類型安全的編程以及在編譯時執行更強的類型檢查非常有用。它們還有助於消除轉型的開銷。示例:

import java.util.LinkedList;
import java.util.List;

public class LinkedListGenericsDemo
{
  public static void main(String[] args) 
  {
	List names = new LinkedList<>();
	names.add("Rams");
	names.add("Posa");
	names.add("Chinni");
        // 我們不能添加除了字符串以外的其他項目
        // names.add(2011);
			
	System.out.println("LinkedList content: " + names);
	System.out.println("LinkedList size: " + names.size());
  }
}

輸出:

LinkedList content: [Rams, Posa, Chinni]
LinkedList size: 3

這裡我們創建了一個帶有泛型的 LinkedList 對象並添加了 3 個項目。當我們嘗試添加一個數字到 LinkedList 時,它會拋出編譯時錯誤。

Java 數組轉 LinkedList

在這一節中,我們將探討如何將Java數組轉換為LinkedList對象。我們可以用多種方法來做,但在這裡我只提供了一種方法。示例:


import java.util.LinkedList;
import java.util.List;

public class JavaArrayToLinkedListDemo 
{
	public static void main(String[] args) 
	{
		Integer[] numbers = {1,2,3,4,5};
		List<Integer> numbersList = new LinkedList<>();
		for(Integer s : numbers){
			numbersList.add(s);
		}
		System.out.println(numbersList);
	}
}

輸出:

[1, 2, 3, 4, 5]

Java LinkedList轉換為數組

在這一節中,我們將探討如何將Java LinkedList轉換為數組。我們可以用多種方法來做,但在這裡我只提供了一種方法。示例:

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class LinkedListToJavaArrayDemo 
{
	public static void main(String[] args) 
	{		
		List<Integer> numbersList = new LinkedList<>();
		numbersList.add(1);
		numbersList.add(2);
		numbersList.add(3);
		numbersList.add(4);
		numbersList.add(5);
		Integer[] numbers = new Integer[numbersList.size()];
		
		numbers = numbersList.toArray(numbers);
		System.out.println(Arrays.toString(numbers));

	}
}

輸出:

[1, 2, 3, 4, 5]

Java LinkedList實時用例

在這一節中,我們將討論在Java應用程序中使用LinkedList的最佳和最壞情況。 最佳用例場景:

  • 當我們經常使用的操作是在列表中間添加或刪除元素時,LinkedList是最好的類來使用。

為什麼?因為我們不需要在列表中間添加或刪除元素時進行更多的移位。請參閱“Java LinkedList中的插入操作是如何工作的?”部分以了解詳情。最壞用例場景:

  • 當我們經常使用的操作是從列表中檢索元素時,LinkedList 是最差的選擇。

為什麼? 因為 LinkedList 只支持順序訪問,不支持隨機訪問。請參考“在 Java LinkedList 中刪除的工作原理”部分以了解詳細信息。 注意:- LinkedList 實現了 List、Deque、Cloneable 和 Serializable,但沒有實現 RandomAccess 接口。

Java LinkedList 的內部表示

正如我們所知,Java LinkedList 在內部是使用雙向鏈表實現的。因此,Java LinkedList 將其元素表示為節點。每個節點分為以下 3 部分。 在這裡,每個節點用於特定目的。

  1. 左側節點部分用於指向 LinkedList 中的前一個節點(或元素)。
  2. 右側節點部分用於指向 LinkedList 中的下一個節點(或元素)。
  3. 中心節點部分用於存儲實際數據。

注意: 在 JVM 中,LinkedList 不會按照連續順序存儲其元素。它將元素存儲在任何可用的空間中,並使用左側和右側節點部分將它們連接起來,如下圖所示。

Java LinkedList 中的插入操作是如何工作的?

我們已經看到了前一節中 LinkedList 如何將其元素存儲為節點。在本節中,我們將討論 Java LinkedList 的插入操作在內部是如何工作的。

  1. 讓我們假設我們的初始 LinkedList 包含以下數據。
    3. 執行以下插入操作以在此 LinkedList 上執行插入操作
linkedList.add(2,54);

這裡我們試圖執行插入操作,將值為“54”的新元素添加到索引 2.5。更新的 LinkedList 如下所示。

Java LinkedList 中的刪除操作是如何工作的?

我們已經在前一節中看到了LinkedList如何在內部執行插入操作。在本節中,我們將討論Java LinkedList的刪除操作在內部是如何工作的。

  1. 讓我們假設我們的初始LinkedList具有以下數據。3. 在這個LinkedList上執行以下插入操作
linkedList.remove(3);

這裡我們試圖執行刪除操作來刪除索引為3.5的元素。更新後的LinkedList看起來像下面這樣。

Java LinkedList Deque Operations

在這裡,我們將探討LinkedList物件作為Deque的工作方式。我們使用這些操作來實現隊列或堆棧。我們將在接下來的帖子中深入討論堆棧或隊列的工作原理。示例:

import java.util.LinkedList;
import java.util.LinkedList;
import java.util.Deque;

public class LinkedListDequeOperationsDemo 
{
  public static void main(String[] args) 
  {
	Deque names = new LinkedList();
	names.add(2);
	names.addFirst(1);
	names.addLast(3);
	names.addFirst(0);
	names.addLast(4);
			
	System.out.println("LinkedList content: " + names);
	System.out.println("LinkedList size: " + names.size());
	names.removeFirst();
	names.removeLast();
	
	System.out.println("LinkedList content: " + names);
	System.out.println("LinkedList size: " + names.size());	
  }
}

輸出:

LinkedList content: [0, 1, 2, 3, 4]
LinkedList size: 5
LinkedList content: [1, 2, 3]
LinkedList size: 3

Java SE 8:Java LinkedList轉換為Stream

在這裡,我們將探討如何將LinkedList物件轉換為Java SE 8 Stream概念。示例:

import java.util.LinkedList;
import java.util.List;

public class LinkedListToStreamDemo 
{
  public static void main(String[] args) 
  {		
	List numbersList = new LinkedList<>();
	numbersList.add(1);
	numbersList.add(2);
	numbersList.add(3);
	numbersList.add(4);
	numbersList.add(5);
		
	//將列表轉換為流
	numbersList.stream().forEach(System.out::println);
  }
}

輸出:-

1
2
3
4
5

Java SE 9 LinkedList

在Java SE 9中,Oracle Corp將添加一些有用的實用程序方法來創建不可變列表。如果您想深入了解它們並通過一些有用的示例進行學習,請查看我的帖子:Java SE 9: 不可變列表的工廠方法這就是Java中LinkedList的快速總結。我希望這些Java LinkedList示例能幫助您開始進行LinkedList編程。感謝您閱讀我的教程。如果您喜歡我的教程,或者有任何問題、建議或任何類型的錯誤,請給我留言。

Source:
https://www.digitalocean.com/community/tutorials/java-linkedlist-linkedlist-java