在Sedgewick的 algorithms4 一书的第201页中,Node
占用的内存为40字节:
class Node{
Item item;
Node next;
}
给出的细分是:
额外开销的解释是:
作为Node类(第142页)的嵌套非静态(内部)类需要额外的8个字节(用于引用封闭实例)
他提到的封闭实例是什么? Node
类仅包含item
和next
个变量。
有人可以澄清一下吗?
答案 0 :(得分:1)
它表示Node
是非静态内部类。如果该类是静态内部类,则它可以在没有封闭类的情况下存在。由于不是静态,取决于(是其中的一部分)定义它的外部类的实例。
所以,如果我有一个类Bar
和一个静态内部类Foo
:
public class Bar {
private class Foo {
}
}
为了使用Foo
,我必须有一个封闭的Bar
,例如
Foo foo= new Bar().new Foo();
如果Foo
是静态的,我可以
Foo foo= new Bar.Foo(); //i.e. new Bar.Foo()
因此,对于Bar
的封闭实例,您需要额外的8个字节。
答案 1 :(得分:1)
他提到的这个封闭实例是什么?
它是LinkedList
对象所属的Node
类的实例。
实际上,如果使用javap检查ArrayList$Node.class
文件,您应该会看到一个神秘的合成属性,其中包含对封闭的ArrayList
实例的引用。