我无法理解泛型的原始包装开销。
例如
在下面的数据结构中,为什么没有将 24 字节的开销添加到每个项目,而是为 N
输入添加一次。
换个方式提问,为什么整体内存空间不是96N而是24+72N或者为什么24加一次。
public class GenericMysteryBox<Item> { // 16(object overhead)
private Node first; // 8 (reference)
private class Node { // 16(object overhead)
// 8 (inner class overhead)
private Item item; // 8 (reference to Integer)
// 24(Integer)
private Node next; // 8 (reference)
private Node prev; // 8 (reference)
} // -------
// 24 + 72N ~ 72N
}
最佳答案
因为 Node
的类声明(同时是一个内部类)在实例之间是不可变的。也就是说,GenericMysteryBox
的每个实例都包含一个 Node
,它(在 type erasure 之后)有一个 Object
引用和两个 Node
引用。
这与 Node
被声明为非私有(private)非内部类(忽略 Node
的可见性)完全相同。
考虑一下,
class Node<Item> {
private Item item;
private Node next;
private Node prev;
}
public class GenericMysteryBox<Item> {
private Node<Item> first;
}
关于java - 原始包装器内存空间开销与泛型,在 Java 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35545057/