Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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中存储只有0和1的数组的有效方法_Java_Arrays_Bit - Fatal编程技术网

在Java中存储只有0和1的数组的有效方法

在Java中存储只有0和1的数组的有效方法,java,arrays,bit,Java,Arrays,Bit,在Java中存储1和0的数组最节省空间的方法是什么?答案会有所不同,这取决于您是否事先知道数组的大小,以及数据的稀疏程度或随机程度 首先,如果您正在寻找最高效的存储,那么您需要压缩数据,而不是存储原始的0和1。一个典型的好的压缩算法是,尽管它并不总是“最好的”,尤其是当数据是随机的。你可以找到一个 回到原来的问题,假设你想保留原始值;最有效的存储取决于您是否事先知道阵列的大小。如果是固定大小,则可以创建大量的byte原语。每一个都需要1个字节,加上存储它们的对象的开销。您可以根据需要使用shor

在Java中存储1和0的数组最节省空间的方法是什么?

答案会有所不同,这取决于您是否事先知道数组的大小,以及数据的稀疏程度或随机程度

首先,如果您正在寻找最高效的存储,那么您需要压缩数据,而不是存储原始的0和1。一个典型的好的压缩算法是,尽管它并不总是“最好的”,尤其是当数据是随机的。你可以找到一个

回到原来的问题,假设你想保留原始值;最有效的存储取决于您是否事先知道阵列的大小。如果是固定大小,则可以创建大量的
byte
原语。每一个都需要1个字节,加上存储它们的对象的开销。您可以根据需要使用
short
int
long
将2、4或8个字节分组,从而减少变量的数量。如果您将这些变量作为一个类的成员与其他变量一起包含,那么您使用的类型可能会有所不同,因为对象本身需要8字节的开销,并且大小始终是8字节的倍数;因此,任何缺少该值的变量都将被填充为8字节的倍数

如果您需要一个任意大小的数组(它会产生12字节的开销,8字节用于对象,4字节用于数组长度),那么答案仍然是一个
字节[]
数组,8位中的每一位都映射到1和0。但是,JVM以8字节的块分配内存,因此1到4字节将占用
int
的内存占用空间,因此
byte[]
数组最终将匹配
short[]
int[]
的内存占用空间,并且不需要分配小于32位的数组(只要您确保有效地使用所有位。
long[]
由于12字节的对象开销和16字节的分配舍入,最终总是比其他整数数组类型多占用8字节

然而,归根结底,可读性/可用性可能胜过内存使用。
BitSet
将值存储为
long[]
,并且具有更友好的访问方法,可能是最大限度地减少(不完全是,但对于实际用途来说足够好)内存占用的最佳选择


boolean[]
可能是CPU处理速度最快的方法,但它需要8倍的内存作为基本整数类型。

我希望您已经使用了
BitSet
。我认为这是存储位的有效方法。


但是您应该将0视为false,将1视为true,我认为存储二进制矩阵最节省空间的方法是使用。 在稀疏矩阵中,您只需要使用交叉列表结构表示“1”值


您可以在上找到一些实现。

数组有多大?为什么需要对这些位执行不同类型的操作?位集在引擎盖下使用长[],因此它将位存储在64位块中。的确,对于<64位,它不是有效的,但是对于大位集是有效的。它不是“最有效的”除非您有64的倍数,在这种情况下它与字节[]相连。实际上,JVM以8字节(64位)分配内存块,因此任何基元整数最终都会有相同的内存占用。您在这里搞错了。位集以long存储值并不意味着每个位都由long表示。1到64位需要1 long。65到128位需要2 long,以此类推。