java中LinkedList的节点类的内存使用(包含实例引用)



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

class Node{
    Item item;
    Node next;
} 

给出的分类如下:

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

额外开销的解释如下:

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

他提到的封装实例是什么?Node类只包含itemnext变量。

有人能解释一下吗?

它说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实例的引用。

最新更新