[英]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
類型)是直接將列表的元素彼此鏈接起來。 這有幾個后果:
這需要元素 class 本身有一個next
字段(可能還有一個prev
字段)用於鏈接元素。
這意味着給定的元素實例一次只能是一個列表的成員,並且不能兩次成為同一個列表的成員。
總之,這些意味着無節點方法與標准java.util.List
API 不兼容。
從 OO 設計的角度來看,無節點方法也很糟糕:
next
和prev
字段,您正在打破抽象邊界和關注點分離。這些東西很容易使無節點列表抽象更難使用……並且更難重用。 (雖然在有限的情況下,它可能仍然是一個很好的解決方案。)
從技術上講,您不一定需要節點 class,但具有節點 class 的設計是好的設計。 沒有一個的設計是糟糕的設計。
這個答案有點自以為是,但基於我們在編程的第一年或至少第二年都應該學到的東西,所以是基於共識的。
假設我們有一份學生名單。 現在每個Student
object 的自然責任是擁有(“知道”)學生的聯系信息、注冊的課程、取得的成績等。知道它是鏈表的一部分不是Student
object 的自然責任,更不用說該列表是單鏈接還是雙鏈接了。 對於這個責任,我們有Node
class。
Node
class 的設計具有進一步的潛在優勢,您可以設計和編寫通用鏈表並使用它來實例化學生列表、教師列表、課程列表等。Stephen C 在另一個答案中提到進一步的優勢。
歷史背景:我在 1980 年左右學習數據結構時,我們會為每個學生記錄配備一個next
指針。 (我們學的是單向鏈表,雙向鏈表只是順便提一下。)現在被認為是糟糕的設計。 我曾希望它早已不再使用。
性能(跳過這一段,直到你真的需要它:-):在像Student
這樣的業務對象中使用next
和previous
引用的糟糕設計通常會稍微好一點。 因此,如果您處於性能是一個非常現實的問題的情況下,您可以考慮它。 它不是唾手可得的果實,因為它會污染您的設計,因此它可能會在您為提高性能而采取的措施列表中排在最后。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.