为什么 LinkedList 需要 Java 中的节点 class?
Why do I need the Node class in Java for LinkedList?
在浏览了关于链接列表的不同教程后,我看到一些人提到 Java Node class 用于链接到上一个和下一个节点,而有些人根本不使用它创建一个链表。
链表需要节点 class 吗?
为什么有些教程似乎在没有它的情况下创建链表?
另请阅读,使用节点 class 是创建链表 [=13=] 的“正式”方式
如果您问是否(以及为什么)需要创建 Node
个实例来使用 java.util.LinkedList
,答案是:不,您不需要。列表本身会处理这个问题。
(注意你linked to的Node
class不是链表节点,它实际上表示DOM中的一个节点。实际Node
class 由 java.util.LinkedList
内部使用 是私有的 class。)
如果您要问为什么链表 通常 需要 Node
类型,答案是它们不需要。
创建链表的另一种方法(不涉及 Node
类型)是直接将列表的元素彼此链接起来。这有几个后果:
这要求元素 class 本身有一个 next
字段(可能还有一个 prev
字段)用于链接元素。
意思是给定的元素实例一次只能是一个列表的成员,不能是同一个列表的成员两次。
总的来说,这些意味着无节点方法与标准不兼容 java.util.List
API。
从 OO 设计的角度来看,无节点方法也很糟糕:
- 通过向元素类型添加
next
和 prev
字段,您正在打破抽象边界和关注点分离。
- 元素实例现在知道该元素所属的列表。
- 列表抽象仅适用于某些类型的元素,并且必须考虑元素属于哪个列表。
这些东西很容易使无节点列表抽象更难使用……并且更难重用。 (虽然在有限的情况下,它可能仍然是一个很好的解决方案。)
从技术上讲,您不一定 需要 节点 class,但具有节点 class 的设计是好的设计。没有一个的设计是糟糕的设计。
这个答案有点自以为是,但基于我们在编程的第一年或至少第二年都应该学到的东西,所以基于共识。
假设我们有一个学生列表。现在每个 Student
对象的自然责任是拥有(“知道”)学生的联系信息、注册的课程、取得的成绩等。不是 的自然责任Student
对象知道它是链接列表的一部分,更不用说该列表是单链接还是双链接了。对于这一责任,我们有 Node
class.
使用 Node
class 的设计具有进一步的潜在优势,您可以设计和编写通用链表并使用它来实例化学生列表、教师列表、课程列表等。Stephen C 在另一个答案中提到了更多优势。
历史背景:我在 1980 年左右学习数据结构时,我们会为每个学生记录配备一个 next
指针。 (我们学的是单向链表,双向链表只是顺便提一下。)现在被认为是糟糕的设计。我还希望它早就不用了。
性能(跳过这一段,直到你真正需要它:-):在业务对象(如 Student
中使用 next
和 previous
引用的糟糕设计通常会稍微好一些.因此,如果您处于性能是一个非常现实的问题的情况下,您可以考虑它。它不是唾手可得的果实,因为它会污染您的设计,因此它可能会排在您为提高性能而采取的措施列表的底部。
在浏览了关于链接列表的不同教程后,我看到一些人提到 Java Node class 用于链接到上一个和下一个节点,而有些人根本不使用它创建一个链表。
链表需要节点 class 吗? 为什么有些教程似乎在没有它的情况下创建链表? 另请阅读,使用节点 class 是创建链表 [=13=] 的“正式”方式
如果您问是否(以及为什么)需要创建 Node
个实例来使用 java.util.LinkedList
,答案是:不,您不需要。列表本身会处理这个问题。
(注意你linked to的Node
class不是链表节点,它实际上表示DOM中的一个节点。实际Node
class 由 java.util.LinkedList
内部使用 是私有的 class。)
如果您要问为什么链表 通常 需要 Node
类型,答案是它们不需要。
创建链表的另一种方法(不涉及 Node
类型)是直接将列表的元素彼此链接起来。这有几个后果:
这要求元素 class 本身有一个
next
字段(可能还有一个prev
字段)用于链接元素。意思是给定的元素实例一次只能是一个列表的成员,不能是同一个列表的成员两次。
总的来说,这些意味着无节点方法与标准不兼容 java.util.List
API。
从 OO 设计的角度来看,无节点方法也很糟糕:
- 通过向元素类型添加
next
和prev
字段,您正在打破抽象边界和关注点分离。 - 元素实例现在知道该元素所属的列表。
- 列表抽象仅适用于某些类型的元素,并且必须考虑元素属于哪个列表。
这些东西很容易使无节点列表抽象更难使用……并且更难重用。 (虽然在有限的情况下,它可能仍然是一个很好的解决方案。)
从技术上讲,您不一定 需要 节点 class,但具有节点 class 的设计是好的设计。没有一个的设计是糟糕的设计。
这个答案有点自以为是,但基于我们在编程的第一年或至少第二年都应该学到的东西,所以基于共识。
假设我们有一个学生列表。现在每个 Student
对象的自然责任是拥有(“知道”)学生的联系信息、注册的课程、取得的成绩等。不是 的自然责任Student
对象知道它是链接列表的一部分,更不用说该列表是单链接还是双链接了。对于这一责任,我们有 Node
class.
使用 Node
class 的设计具有进一步的潜在优势,您可以设计和编写通用链表并使用它来实例化学生列表、教师列表、课程列表等。Stephen C 在另一个答案中提到了更多优势。
历史背景:我在 1980 年左右学习数据结构时,我们会为每个学生记录配备一个 next
指针。 (我们学的是单向链表,双向链表只是顺便提一下。)现在被认为是糟糕的设计。我还希望它早就不用了。
性能(跳过这一段,直到你真正需要它:-):在业务对象(如 Student
中使用 next
和 previous
引用的糟糕设计通常会稍微好一些.因此,如果您处于性能是一个非常现实的问题的情况下,您可以考虑它。它不是唾手可得的果实,因为它会污染您的设计,因此它可能会排在您为提高性能而采取的措施列表的底部。