在Sedgewick的algorithms4一书第201页中,给出了Node
占用的内存为40字节:
class Node{
Item item;
Node next;
}
给出的分类如下:
- 对象开销= 16字节
- 项目引用= 8字节(=内存地址)
- 下一个引用= 8字节
- 额外开销= 8字节
额外开销的解释如下:
一个嵌套的非静态(内部)类,如我们的Node类(第142页)需要额外的8个字节(用于引用封闭实例)
他提到的封装实例是什么?Node
类只包含item
和next
变量。
它说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个字节。
他提到的封闭实例是什么?
Node
对象所属的LinkedList
类的实例。
实际上,如果您使用javap检查ArrayList$Node.class
文件,您应该看到一个神秘的合成属性,其中包含对封闭ArrayList
实例的引用。