我需要为大量 8 位值创建一个节省空间的二维数组。我开始使用几层抽象和泛型来编写我的类,以允许代码重用。一旦我开始实现具体类,我就想到我不能将原始类型作为泛型类参数传递,我将不得不使用包装类。因为我关心空间效率,所以我需要知道:使用包装类的数组与原始数组相比,空间效率有什么区别 ?Byte
byte
3 回答
是的,与相应的 Wrapper 类对象相比,原语是轻量级的。
你可以在这里阅读: Primitives vs Wrappers
根据http://www.javamex.com/tutorials/memory/object_memory_usage.shtml
字节 [] 大小 ~= 12 + 长度
Byte[] 大小 ~= 12 + 20 * 长度(20 = 16 + 4 1 字节对象的大小 + 4 字节引用)
因此,Byte[] 占用的内存可能是 byte[] 的 20 倍。它实际上是最大值,这取决于您创建字节的方式。new Byte 始终是一个新对象,Byte.valueOf 始终是一个缓存实例。它还取决于 CPU,对于 x64,每个引用占用 8 个字节。
观看另一个问题: arraylist 与数组中原始类型的包装器
double 与 Double 的最大问题是后者增加了一些内存开销——在 Sun 32 位 JVM 上每个对象 8 个字节,在其他 JVM 上可能或多或少。然后您需要另外 4 个字节(在 64 位 JVM 上为 8 个字节)来引用该对象。
因此,假设您有 1,000,000 个对象,则差异如下:
双[1000000]
每个条目 8 个字节;总计 = 8,000,000 字节
双[1000000]
每个对象实例 16 个字节 + 每个引用 4 个字节;总计 = 20,000,000 字节
这是否重要取决于您的应用程序。除非您发现自己的内存不足,否则请假设这无关紧要。