簡體   English   中英

為什么LinkedList需要Java中的節點class?

[英]Why do I need the Node class in Java for LinkedList?

在瀏覽了關於鏈接列表的不同教程后,我看到一些提到 Java節點class 用於鏈接到上一個和下一個節點,而有些在創建鏈接列表時根本不使用它。

鏈表需要節點 class 嗎? 為什么有些教程似乎在沒有它的情況下創建鏈表? 另請閱讀使用節點 class 是創建鏈表的“正式”方式

如果您詢問是否(以及為什么)需要創建Node實例以使用java.util.LinkedList ,答案是:不,您不需要。 列表本身會處理這個問題。

(請注意,您鏈接到Node class 不是鏈表節點。它實際上表示 DOM 中的節點。java.util.LinkedList內部使用的實際Node java.util.LinkedList是私有的 class。)


如果您問為什么鏈表通常需要Node類型,答案是它們不需要。

創建鏈表的另一種方法(不涉及Node類型)是直接將列表的元素彼此鏈接起來。 這有幾個后果:

  1. 這需要元素 class 本身有一個next字段(可能還有一個prev字段)用於鏈接元素。

  2. 這意味着給定的元素實例一次只能是一個列表的成員,並且不能兩次成為同一個列表的成員。

總之,這些意味着無節點方法與標准java.util.List API 不兼容。

從 OO 設計的角度來看,無節點方法也很糟糕:

  • 通過向元素類型添加nextprev字段,您正在打破抽象邊界和關注點分離。
  • 元素實例現在知道該元素所屬的列表。
  • 列表抽象僅適用於某些類型的元素,並且必須考慮元素是哪個列表的成員。

這些東西很容易使無節點列表抽象更難使用……並且更難重用。 (雖然在有限的情況下,它可能仍然是一個很好的解決方案。)

從技術上講,您不一定需要節點 class,但具有節點 class 的設計是好的設計。 沒有一個的設計是糟糕的設計。

這個答案有點自以為是,但基於我們在編程的第一年或至少第二年都應該學到的東西,所以是基於共識的。

假設我們有一份學生名單。 現在每個Student object 的自然責任是擁有(“知道”)學生的聯系信息、注冊的課程、取得的成績等。知道它是鏈表的一部分不是Student object 的自然責任,更不用說該列表是單鏈接還是雙鏈接了。 對於這個責任,我們有Node class。

Node class 的設計具有進一步的潛在優勢,您可以設計和編寫通用鏈表並使用它來實例化學生列表、教師列表、課程列表等。Stephen C 在另一個答案中提到進一步的優勢。

歷史背景:我在 1980 年左右學習數據結構時,我們會為每個學生記錄配備一個next指針。 (我們學的是單向鏈表,雙向鏈表只是順便提一下。)現在被認為是糟糕的設計。 我曾希望它早已不再使用。

性能(跳過這一段,直到你真的需要它:-):在像Student這樣的業務對象中使用nextprevious引用的糟糕設計通常會稍微好一點。 因此,如果您處於性能是一個非常現實的問題的情況下,您可以考慮它。 它不是唾手可得的果實,因為它會污染您的設計,因此它可能會在您為提高性能而采取的措施列表中排在最后。

暫無
暫無

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

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