簡體   English   中英

Java 鏈表 class

[英]Java LinkedList class

在 class 中,我使用私有Node class 實現了我自己的LinkedList class,所以我以前從未遇到過這個問題。 但現在我試圖使用 Java 的內置 LinkedList 庫重新解決問題,但遇到了麻煩。 (距離我上次使用 Java 也有好幾年了)。

可以說我有這個簡單的骨架。 我如何將頭節點傳遞給 function?

public static void main(String[] args)
{
    LinkedList<Integer> test = new LinkedList<Integer>();
    doSomething(test.get(0));
}


 
private static void doSomething(Node a)
{
    //stuff
}

也有人可以提醒我這兩者之間有什么區別嗎? 我知道第一個您基本上將列表轉換為 LinkedList 但為什么要這樣做?

List<E> test = new LinkedList<E>();
LinkedList<E> test = new LinkedList<E>();

查看LinkedList的文檔,沒有公開列表節點的方法。 事實上, LinkedList甚至可能以完全不同的方式實現,根本不使用節點,並且仍然具有鏈表的所有屬性和性能保證。 這是一個實現細節。

Java 的本機鏈接 class 存在一些問題。 迭代器可用於訪問節點,但如下所述受到限制。 無法在列表內或從列表到列表移動節點,例如 C++ std::list::splice。

https://en.cppreference.com/w/cpp/container/list/splice

對於 Java,“移動”節點需要移除和插入節點,這涉及對移除的任何節點進行重新分配,以及對插入的任何節點進行分配。

Java 的迭代器不能被淺拷貝。 賦值只是將另一個變量設置為指向同一個迭代器 object。 (C++ 迭代器沒有這個問題)。

任何從列表中刪除或插入節點都會使該列表的所有迭代器無效(用於執行刪除或插入的迭代器除外)。 (C++ 迭代器 function 符合預期)。

標准庫LinkedList class 使用封裝來避免向 class 的用戶(您)公開實現細節(例如如何實現列表節點)。

除了使用破壞封裝的反射等高級技術外,您無法獲得對內部列表節點的引用。

您無需使用列表節點和它們之間的指針,而是使用 LinkedList class 提供的方法來添加和檢索列表元素。 例如:

LinkedList<Integer> test = new LinkedList<Integer>();
test.add(314);
test.add(879);

Integer first = test.getFirst(); // returns 314
Integer first = test.get(1); // returns 879

封裝的好處是 JVM 實現者可以完全自由地更改 LinkedList 的內部實現,而不必擔心破壞您的程序。

如果您使用List接口而不是LinkedList class,您可以在自己的程序中獲得相同的好處,方法是:

List<E> test = new LinkedList<E>();

如果您這樣做,您可以在稍后將testLinkedList更改為ArrayList或任何其他列表實現,而無需對代碼進行其他更改,例如,如果應用程序要求發生變化,或者您發現 ArrayList 為您提供了更好的性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM