Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java字节/字节数组空间效率比较_Java_Generics_Space Efficiency - Fatal编程技术网

Java字节/字节数组空间效率比较

Java字节/字节数组空间效率比较,java,generics,space-efficiency,Java,Generics,Space Efficiency,我需要为大量8位值创建一个节省空间的2D数组。我开始使用几层抽象和泛型来编写类,以允许代码重用。一旦我开始实现这个具体的类,我就意识到我不能将一个基元类型作为泛型类参数传入,我必须使用一个包装类。因为我关心空间效率,所以我需要知道:使用包装类的字节数组与基元字节数组相比,空间效率有什么不同?是的,基元比相应的包装类对象轻 您可以在此处阅读: 看另一个问题: double与double的最大问题是后者增加了一些内存开销——在Sun 32位JVM上每个对象8字节,在其他JVM上可能或多或少。然后需

我需要为大量8位值创建一个节省空间的2D数组。我开始使用几层抽象和泛型来编写类,以允许代码重用。一旦我开始实现这个具体的类,我就意识到我不能将一个基元类型作为泛型类参数传入,我必须使用一个包装类。因为我关心空间效率,所以我需要知道:使用包装类的
字节
数组与基元
字节
数组相比,空间效率有什么不同?

是的,基元比相应的包装类对象轻

您可以在此处阅读:

看另一个问题:

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个字节。