Java字节/字节数组空间效率比较
我需要为大量8位值创建一个节省空间的2D数组。我开始使用几层抽象和泛型来编写类,以允许代码重用。一旦我开始实现这个具体的类,我就意识到我不能将一个基元类型作为泛型类参数传入,我必须使用一个包装类。因为我关心空间效率,所以我需要知道:使用包装类的Java字节/字节数组空间效率比较,java,generics,space-efficiency,Java,Generics,Space Efficiency,我需要为大量8位值创建一个节省空间的2D数组。我开始使用几层抽象和泛型来编写类,以允许代码重用。一旦我开始实现这个具体的类,我就意识到我不能将一个基元类型作为泛型类参数传入,我必须使用一个包装类。因为我关心空间效率,所以我需要知道:使用包装类的字节数组与基元字节数组相比,空间效率有什么不同?是的,基元比相应的包装类对象轻 您可以在此处阅读: 看另一个问题: double与double的最大问题是后者增加了一些内存开销——在Sun 32位JVM上每个对象8字节,在其他JVM上可能或多或少。然后需
字节
数组与基元字节
数组相比,空间效率有什么不同?是的,基元比相应的包装类对象轻
您可以在此处阅读:
看另一个问题:
double与double的最大问题是后者增加了一些内存开销——在Sun 32位JVM上每个对象8字节,在其他JVM上可能或多或少。然后需要另外4个字节(64位JVM上为8个字节)来引用该对象
因此,假设您有1000000个对象,差异如下:
双倍[1000000]
每个条目8字节;总计=8000000字节
双倍[1000000]
每个对象实例16字节+每个引用4字节;总计=20000000字节
这是否重要在很大程度上取决于你的申请。除非你发现自己的内存不足,否则就假设这无关紧要
根据
字节[]大小~=12+长度
字节[]大小~=12+20*长度(20=16+4 1字节对象的大小+4字节引用)
因此,字节[]占用的内存可能是字节[]的20倍。它实际上是最大值,这取决于创建字节的方式。new Byte始终是新对象,Byte.valueOf始终是缓存实例。它还取决于CPU,对于x64,每个引用需要8个字节。感谢Giorashc,我同时也在尝试这样做。我仍然需要知道如何在这个网站上创建链接!只需单击地球图标,粘贴链接,确认,然后在brackets@INdoknight请参阅常见问题解答。但是为什么要对8位值使用泛型呢?如果显式存储8位值,则不同类型的目的是什么?@giorashc我可能希望以后以与当前存储8位值相同的唯一方式存储
对象
或整数
,2D数组是具体的存储实现,但该类的数据结构访问控制是唯一的。我不知道是缓存了字节
对象,还是只缓存了整数,但即使不是,我认为对于任何大小的字节
数组,都可以使用静态字节[256]
来保存每个值的实例;这方面的开销将固定在~4096字节,使用缓存实例的每个Byte[]
数组通常每个条目占用4字节。对字节对象的每个引用为4字节,即16字节。至于缓存,这取决于您如何创建它。新字节总是一个新对象。@Evgeniy Dorofev:在没有压缩OOPs的64位JVM上,引用需要8个字节。