我正在为学校作业编写一个双链接列表的实现,我在列表类中使用一个名为Node的内部节点类,它表示相互链接的列表节点(通常是链接列表)。
class DoublyLinkedList<T>
{
class Node
{
T obj;
}
}我想知道,对于具有许多节点的大型列表,因为每个Node对象都可能引用父list类的一个实例,这是一个很大的开销和次优设计吗?当然,作为一个非静态类很方便--那么节点可能会更改父列表first和last引用,我发现这对于封装非常有用。
如果我使Node是静态的,它就不能再(如果没有显式成员引用列表)来操作父列表( first和last ),我必须从相反的角度来处理它--列表将通过它自己的方法分配和操作节点,即将它们彼此链接起来,取消链接,并自然地调整其first和last值。
为了好的设计和学习,我想知道是什么智能的东西做(c) (如果有的话)?
发布于 2013-03-09 14:35:45
每个节点的开销将恰好是一个引用。假设除了有效负载之外,节点还具有一个先前的链接和一个反向链接,那么在额外的内存使用中,额外引用父节点的开销将达到大约33% (在3个现有内存的基础上有一个引用)。这是相当大的开销,特别是对于大的节点数和小的有效负载。另一方面,有效载荷越大,就不会有多大影响。
不过,一般来说,我不会对有效负载大小作出假设,而将Node类设为static。
发布于 2013-03-09 14:33:57
如果内部类不是static,那么对父类的隐式引用已经存在,您可以通过DoublyLinkedList.this从Node类中引用它。
无论如何,我不明白为什么Node类应该能够直接修改其父类的属性。更改列表的方法(所以first和last也是这样)应该属于DoubleLinkedList类,而不是直接属于Node类。这完全是为了封装,Node实例不应该知道它包含在哪里,或者它是如何从外部使用的。
https://stackoverflow.com/questions/15311803
复制相似问题