为什么我需要Java中的Node类用于LinkedList?



在浏览了不同的链表教程后,我看到有些教程提到了Java Node类,用于链接到上一个和下一个节点,而有些在创建链表时根本没有使用它。

链表需要Node类吗?为什么有些教程似乎没有使用它就创建了链表?另请阅读使用Node类是"正式的"。链接列表的创建方法

如果您问是否(以及为什么)需要创建Node实例来使用java.util.LinkedList,答案是:不,您不需要。列表本身负责这个。

(注意,您链接到的Node类不是链表节点。它实际上表示DOM中的一个节点。java.util.LinkedList内部使用的实际Node是一个私有类。)


如果你问为什么链表一般需要Node类型,答案是它们不需要。

另一种创建链表的方法(不涉及Node类型)是直接将链表的元素彼此链接。这会产生两个结果:

  1. 这要求元素类本身有一个next字段(也可能是prev字段)用于链接元素。

  2. 这意味着一个给定的元素实例一次只能是一个列表的成员,并且不能是同一个列表的成员两次。

这意味着无节点方法与标准java.util.ListAPI不兼容。

从OO设计的角度来看,无节点的方法也是不好的:

  • 通过将nextprev字段添加到元素类型中,您正在打破抽象边界和关注点分离。
  • 元素实例现在知道该元素属于哪个列表。
  • 列表抽象只适用于特定类型的元素,并且必须考虑列表中元素是其成员。

这些东西容易使无节点列表抽象更难使用…而且更不容易重复使用。(尽管在有限的情况下,它可能仍然是一个很好的解决方案。)

技术上不一定需要节点类,但是带有节点类的设计是好的设计。没有一个的设计是糟糕的设计。

这个答案有点固执己见,但基于我们在第一年或至少第二年编程时应该学到的东西,所以是基于共识的。

假设我们有一个学生名单。现在,每个Student对象自然有责任知道("知道")学生的联系信息、注册的课程、取得的成绩等。不是Student对象的自然责任,知道它是链表的一部分,更不用说该列表是单链接还是双链接。对于这个职责,我们有Node类。

Node类的设计还有一个潜在的优势,你可以设计和编写一个通用的链表,并用它来实例化一个学生列表、一个教师列表、一个课程列表等。Stephen C在另一个回答中提到了更多的优势。

历史背景:我在1980年左右学习数据结构,我们会用next指针来匹配每个学生的记录。(我们学习了单链表。双链表只是顺带提到过。)现在被认为是糟糕的设计。我曾希望它早就不用了。

性能(跳过这一段,直到您真正需要它:-):在业务对象(如Student)中使用nextprevious引用的糟糕设计通常会稍微好一些。因此,如果您的情况下,性能是一个非常现实的问题,您可能会考虑它。它不是唾手可得的果实,因为它会污染您的设计,所以它可能会接近您为获得更好的性能而采取的措施列表的底部。

最新更新