java中LinkedList的节点类的内存使用情况(封闭实例引用)

时间:2013-06-21 09:53:43

标签: java algorithm memory reference

在Sedgewick的 algorithms4 一书的第201页中,Node占用的内存为40字节:

class Node{
    Item item;
    Node next;
} 

给出的细分是:

  • 对象开销= 16字节
  • 项目引用= 8个字节(=内存地址)
  • next reference = 8 bytes
  • 额外开销= 8字节

额外开销的解释是:

  

作为Node类(第142页)的嵌套非静态(内部)类需要额外的8个字节(用于引用封闭实例)

他提到的封闭实例是什么? Node类仅包含itemnext个变量。

有人可以澄清一下吗?

2 个答案:

答案 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实例的引用。