java数组的大小超出了int的表示范围怎么办?

时间:2023-01-26 16:21:33
大家好,现在遇到了一个实际问题。一般情况下定义一个数组可以写成

int size = 7;
booean[] visited = new boolean[size];

但现在的问题是需要的数组很大,超出了int的表示范围,第一感觉是换成 long,即

long size = 7;
booean[] visited = new boolean[size];

但这样就直接报错了,提示不能把long转化为int.
还有,像List,ArrayList中获取第i元素的get(i)函数中的i都是int型,但都会涉及到长度大于int的最大值问题,大家遇到这个问题是怎么解决的?
先谢谢大家了。

18 个解决方案

#1


要是真到了这么大长度,楼主就要考虑放弃数组了
比如你这里的boolean类型,用数组太浪费了,一个int有32位你用它的31位来表示boolean就行啊,位运算嘛。

#2


数组的大小能超出int的表示范围?一个数组足够放 2^31-1个元素啊。你有多少数据能不够它放啊

#3


牛X 一个数组都能超过int32,这可是21亿啊。

#4


引用 1 楼 abc41106 的回复:
要是真到了这么大长度,楼主就要考虑放弃数组了
比如你这里的boolean类型,用数组太浪费了,一个int有32位你用它的31位来表示boolean就行啊,位运算嘛。
谢谢,非常好的思路,我仔细想。

#5


引用 3 楼 AFer198215 的回复:
牛X 一个数组都能超过int32,这可是21亿啊。

是数据挖掘上的一个算法遇到的,现在数据集中只有80000条记录,但要求任意两记录的相似度,并且还要临时保存这些相似度。任意两记录的相似度可以用一个矩阵表示(二维数组),但因为是对称矩阵,只用存大约一半相似度就行,即(80000 + 1)*80000/2,可以用一维数组存这些相似度。可(80000 + 1)*80000/2超出了int的范围。

#6


引用 2 楼 suciver 的回复:
数组的大小能超出int的表示范围?一个数组足够放 2^31-1个元素啊。你有多少数据能不够它放啊

是数据挖掘上的一个算法遇到的,现在数据集中只有80000条记录,但要求任意两记录的相似度,并且还要临时保存这些相似度。任意两记录的相似度可以用一个矩阵表示(二维数组),但因为是对称矩阵,只用存大约一半相似度就行,即(80000 + 1)*80000/2,可以用一维数组存这些相似度。可(80000 + 1)*80000/2超出了int的范围。

#7


这么多数据不能一下子处理的,要不内存溢出了。你可以先拿一部分一部分的处理啊

#8


引用 6 楼 zhouyang209117 的回复:
引用 2 楼 suciver 的回复:数组的大小能超出int的表示范围?一个数组足够放 2^31-1个元素啊。你有多少数据能不够它放啊
是数据挖掘上的一个算法遇到的,现在数据集中只有80000条记录,但要求任意两记录的相似度,并且还要临时保存这些相似度。任意两记录的相似度可以用一个矩阵表示(二维数组),但因为是对称矩阵,只用存大约一半相似度就行,即(80000 + 1)……


当真的遇到很大的长度时,使用一个缓冲的方法来做处理,比如,可以将中间的结果放到数据库中,然后,通过数据库的方式来计算结果,这样程序中就不用使用很大的数组了。

#9


引用 1 楼 abc41106 的回复:
要是真到了这么大长度,楼主就要考虑放弃数组了
比如你这里的boolean类型,用数组太浪费了,一个int有32位你用它的31位来表示boolean就行啊,位运算嘛。

正解

#10


引用 5 楼 zhouyang209117 的回复:
引用 3 楼 AFer198215 的回复:牛X 一个数组都能超过int32,这可是21亿啊。
是数据挖掘上的一个算法遇到的,现在数据集中只有80000条记录,但要求任意两记录的相似度,并且还要临时保存这些相似度。任意两记录的相似度可以用一个矩阵表示(二维数组),但因为是对称矩阵,只用存大约一半相似度就行,即(80000 + 1)*80000/2,可以用一维数组存这些相……


那就用你的二维数组存放呀,  为什么你要转化成一维数组呢

#11


本人还没出现过数组大小超出int范围的情况,强烈表示围观!

#12


应该是你的算法有问题,用数组存这么多元素.
换种思路吧.

#13


呵呵 010101

#14


引用 10 楼 oZouBianBian 的回复:
引用 5 楼 zhouyang209117 的回复:
引用 3 楼 AFer198215 的回复:牛X 一个数组都能超过int32,这可是21亿啊。
是数据挖掘上的一个算法遇到的,现在数据集中只有80000条记录,但要求任意两记录的相似度,并且还要临时保存这些相似度。任意两记录的相似度可以用一个矩阵表示(二维数组),但因为是对称矩阵,只用存大约一半相似度就行,即(80000 + 1)*8000……

2维数组有一半都是冗余的,因为是对称矩阵。

#15


引用 14 楼 zhouyang209117 的回复:
引用 10 楼 oZouBianBian 的回复:引用 5 楼 zhouyang209117 的回复:
引用 3 楼 AFer198215 的回复:牛X 一个数组都能超过int32,这可是21亿啊。
是数据挖掘上的一个算法遇到的,现在数据集中只有80000条记录,但要求任意两记录的相似度,并且还要临时保存这些相似度。任意两记录的相似度可以用一个矩阵表示(二维数组),但……


你转化成一维数组将会对你的数据的查找带来很大的麻烦,这势必会对你这样大数据量的处理带来性能上的很大影响并且刚刚想了下,你的这些临时数据如果都是boolean值的话, 就算按照你转化成一位数组的话,将要花费掉将近400M的存储空间,这么大的数据是要驻留内存吗,如果是的话, 看你们的条件允许不?不允许的话那你们应该考虑一下算法的东西吧, 如果是要放到硬盘里面去,估计软件的性能会让你绝望

#16


引用 15 楼 oZouBianBian 的回复:
引用 14 楼 zhouyang209117 的回复:
引用 10 楼 oZouBianBian 的回复:引用 5 楼 zhouyang209117 的回复:
引用 3 楼 AFer198215 的回复:牛X 一个数组都能超过int32,这可是21亿啊。
是数据挖掘上的一个算法遇到的,现在数据集中只有80000条记录,但要求任意两记录的相似度,并且还要临时保存这些相似度。任意两记录的相似度可……

你好。我换了一个思路,空间复杂度为O(n^2)降为O(n+e)。我也觉得实际中应该尽量避免“数组长度超出int的表示范围”情况发生。如果一定要解决这个问题,就“长度为32亿的boolean型数组来讲”,就像一楼提供的思路,可以用长度为1亿的int型一维数组表示长度为32亿的boolean型数组,因为每个int是4字节,32位。 oracle的官方文档上对boolean所占空间的描述是its "size" isn't something that's precisely defined。意思是boolean所占空间没有精确定义,应该是与平台用关,程序员无法控制。所以可以用1亿的int型数组精确表示32亿位。

#17


用集合啦 ArrayList

#18


引用 16 楼 zhouyang209117 的回复:
你好。我换了一个思路,空间复杂度为O(n^2)降为O(n+e)。我也觉得实际中应该尽量避免“数组长度超出int的表示范围”情况发生。如果一定要解决这个问题,就“长度为32亿的boolean型数组来讲”,就像一楼提供的思路,可以用长度为1亿的int型一维数组表示长度为32亿的boolean型数组,因为每个int是4字节,32位。 oracle的官方文档上对boolean所占空间的描述是its "size" isn't something that's precisely defined。意思是boolean所占空间没有精确定义,应该是与平台用关,程序员无法控制。所以可以用1亿的int型数组精确表示32亿位。


struct{
boolean b,
int i
}
32位机,int占4字节,即32位。以上结构体,占用8字节,原因是计算机会数位对齐,就是boolean同样占4字节(而不是1字节)

struct{
boolean b, boolean b2, boolean b3, boolean b4,
int i
}
这个结构体同样占8字节。

如果你用int代替boolean还是不够,可以参考一下C++的bitsets,bitsets可以自定义N位的一个bitset对象,但只能对位进行操作~ 不过我测试过,bitset最大是X位(我忘了多少,你可以试试),占10+M内存(sizeof输出来看)。后来我改进过,自己写一个类似bitset功能的类,容量只占很少(其实就是将int用数组连接起来,对每一个int的位操作,外部看起来就好像对一个超大的int操作)

希望我的思路对你有帮助!

#1


要是真到了这么大长度,楼主就要考虑放弃数组了
比如你这里的boolean类型,用数组太浪费了,一个int有32位你用它的31位来表示boolean就行啊,位运算嘛。

#2


数组的大小能超出int的表示范围?一个数组足够放 2^31-1个元素啊。你有多少数据能不够它放啊

#3


牛X 一个数组都能超过int32,这可是21亿啊。

#4


引用 1 楼 abc41106 的回复:
要是真到了这么大长度,楼主就要考虑放弃数组了
比如你这里的boolean类型,用数组太浪费了,一个int有32位你用它的31位来表示boolean就行啊,位运算嘛。
谢谢,非常好的思路,我仔细想。

#5


引用 3 楼 AFer198215 的回复:
牛X 一个数组都能超过int32,这可是21亿啊。

是数据挖掘上的一个算法遇到的,现在数据集中只有80000条记录,但要求任意两记录的相似度,并且还要临时保存这些相似度。任意两记录的相似度可以用一个矩阵表示(二维数组),但因为是对称矩阵,只用存大约一半相似度就行,即(80000 + 1)*80000/2,可以用一维数组存这些相似度。可(80000 + 1)*80000/2超出了int的范围。

#6


引用 2 楼 suciver 的回复:
数组的大小能超出int的表示范围?一个数组足够放 2^31-1个元素啊。你有多少数据能不够它放啊

是数据挖掘上的一个算法遇到的,现在数据集中只有80000条记录,但要求任意两记录的相似度,并且还要临时保存这些相似度。任意两记录的相似度可以用一个矩阵表示(二维数组),但因为是对称矩阵,只用存大约一半相似度就行,即(80000 + 1)*80000/2,可以用一维数组存这些相似度。可(80000 + 1)*80000/2超出了int的范围。

#7


这么多数据不能一下子处理的,要不内存溢出了。你可以先拿一部分一部分的处理啊

#8


引用 6 楼 zhouyang209117 的回复:
引用 2 楼 suciver 的回复:数组的大小能超出int的表示范围?一个数组足够放 2^31-1个元素啊。你有多少数据能不够它放啊
是数据挖掘上的一个算法遇到的,现在数据集中只有80000条记录,但要求任意两记录的相似度,并且还要临时保存这些相似度。任意两记录的相似度可以用一个矩阵表示(二维数组),但因为是对称矩阵,只用存大约一半相似度就行,即(80000 + 1)……


当真的遇到很大的长度时,使用一个缓冲的方法来做处理,比如,可以将中间的结果放到数据库中,然后,通过数据库的方式来计算结果,这样程序中就不用使用很大的数组了。

#9


引用 1 楼 abc41106 的回复:
要是真到了这么大长度,楼主就要考虑放弃数组了
比如你这里的boolean类型,用数组太浪费了,一个int有32位你用它的31位来表示boolean就行啊,位运算嘛。

正解

#10


引用 5 楼 zhouyang209117 的回复:
引用 3 楼 AFer198215 的回复:牛X 一个数组都能超过int32,这可是21亿啊。
是数据挖掘上的一个算法遇到的,现在数据集中只有80000条记录,但要求任意两记录的相似度,并且还要临时保存这些相似度。任意两记录的相似度可以用一个矩阵表示(二维数组),但因为是对称矩阵,只用存大约一半相似度就行,即(80000 + 1)*80000/2,可以用一维数组存这些相……


那就用你的二维数组存放呀,  为什么你要转化成一维数组呢

#11


本人还没出现过数组大小超出int范围的情况,强烈表示围观!

#12


应该是你的算法有问题,用数组存这么多元素.
换种思路吧.

#13


呵呵 010101

#14


引用 10 楼 oZouBianBian 的回复:
引用 5 楼 zhouyang209117 的回复:
引用 3 楼 AFer198215 的回复:牛X 一个数组都能超过int32,这可是21亿啊。
是数据挖掘上的一个算法遇到的,现在数据集中只有80000条记录,但要求任意两记录的相似度,并且还要临时保存这些相似度。任意两记录的相似度可以用一个矩阵表示(二维数组),但因为是对称矩阵,只用存大约一半相似度就行,即(80000 + 1)*8000……

2维数组有一半都是冗余的,因为是对称矩阵。

#15


引用 14 楼 zhouyang209117 的回复:
引用 10 楼 oZouBianBian 的回复:引用 5 楼 zhouyang209117 的回复:
引用 3 楼 AFer198215 的回复:牛X 一个数组都能超过int32,这可是21亿啊。
是数据挖掘上的一个算法遇到的,现在数据集中只有80000条记录,但要求任意两记录的相似度,并且还要临时保存这些相似度。任意两记录的相似度可以用一个矩阵表示(二维数组),但……


你转化成一维数组将会对你的数据的查找带来很大的麻烦,这势必会对你这样大数据量的处理带来性能上的很大影响并且刚刚想了下,你的这些临时数据如果都是boolean值的话, 就算按照你转化成一位数组的话,将要花费掉将近400M的存储空间,这么大的数据是要驻留内存吗,如果是的话, 看你们的条件允许不?不允许的话那你们应该考虑一下算法的东西吧, 如果是要放到硬盘里面去,估计软件的性能会让你绝望

#16


引用 15 楼 oZouBianBian 的回复:
引用 14 楼 zhouyang209117 的回复:
引用 10 楼 oZouBianBian 的回复:引用 5 楼 zhouyang209117 的回复:
引用 3 楼 AFer198215 的回复:牛X 一个数组都能超过int32,这可是21亿啊。
是数据挖掘上的一个算法遇到的,现在数据集中只有80000条记录,但要求任意两记录的相似度,并且还要临时保存这些相似度。任意两记录的相似度可……

你好。我换了一个思路,空间复杂度为O(n^2)降为O(n+e)。我也觉得实际中应该尽量避免“数组长度超出int的表示范围”情况发生。如果一定要解决这个问题,就“长度为32亿的boolean型数组来讲”,就像一楼提供的思路,可以用长度为1亿的int型一维数组表示长度为32亿的boolean型数组,因为每个int是4字节,32位。 oracle的官方文档上对boolean所占空间的描述是its "size" isn't something that's precisely defined。意思是boolean所占空间没有精确定义,应该是与平台用关,程序员无法控制。所以可以用1亿的int型数组精确表示32亿位。

#17


用集合啦 ArrayList

#18


引用 16 楼 zhouyang209117 的回复:
你好。我换了一个思路,空间复杂度为O(n^2)降为O(n+e)。我也觉得实际中应该尽量避免“数组长度超出int的表示范围”情况发生。如果一定要解决这个问题,就“长度为32亿的boolean型数组来讲”,就像一楼提供的思路,可以用长度为1亿的int型一维数组表示长度为32亿的boolean型数组,因为每个int是4字节,32位。 oracle的官方文档上对boolean所占空间的描述是its "size" isn't something that's precisely defined。意思是boolean所占空间没有精确定义,应该是与平台用关,程序员无法控制。所以可以用1亿的int型数组精确表示32亿位。


struct{
boolean b,
int i
}
32位机,int占4字节,即32位。以上结构体,占用8字节,原因是计算机会数位对齐,就是boolean同样占4字节(而不是1字节)

struct{
boolean b, boolean b2, boolean b3, boolean b4,
int i
}
这个结构体同样占8字节。

如果你用int代替boolean还是不够,可以参考一下C++的bitsets,bitsets可以自定义N位的一个bitset对象,但只能对位进行操作~ 不过我测试过,bitset最大是X位(我忘了多少,你可以试试),占10+M内存(sizeof输出来看)。后来我改进过,自己写一个类似bitset功能的类,容量只占很少(其实就是将int用数组连接起来,对每一个int的位操作,外部看起来就好像对一个超大的int操作)

希望我的思路对你有帮助!