1

在 Sedgewick 的算法4书的第 201 页中,a 占用的内存Node为 40 个字节:

class Node{
    Item item;
    Node next;
} 

给出的细分是:

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

额外开销的解释是:

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

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

有人可以澄清一下吗?

4

2 回答 2

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()

因此,您需要这些额外的 8 个字节用于Bar.

于 2013-06-21T10:00:56.913 回答
1

他提到的这个封闭实例是什么?

它是对象所属的LinkedList类的实例。Node

事实上,如果您使用 javap 检查ArrayList$Node.class文件,您应该会看到一个神秘的合成属性,其中包含对封闭ArrayList实例的引用。

于 2013-06-21T10:02:18.147 回答