如何在java中创建一个大数组

我想创建一个大小的布尔数组,用户将其作为输入。例如 – 用户可能会输入一个大数字,如1000000000000; 所以我必须创建一个大小为1000000000000的布尔数组。我面临的问题是,我不能将输入存储为int,因为它无法容纳如此大的数字 – 因此我无法创建数组.Double是一个选项。我可以将输入数字存储为double,但我不知道如何创建双数字大小的数组。这就是这个想法 –

Scanner scanner = new Scanner(System.in); int target = scanner.nextInt(); boolean [] array_a=new boolean [(target)]; 

如果目标超过int范围,它将无法工作。任何帮助表示赞赏。

更新:谢谢大家。所以你只能创建一个int的最大范围(2147483648)大小的数组,对吧?内存方面没有提到我。 要采取不同的方法。

必须创建一个大小为1000000000000的布尔数组。我面临的问题是,我不能将输入存储为int

你的问题不是那个。 您的主要问题是您将没有足够的内存来分配具有1,000,000,000,000个元素的数据结构(即使您克服了int索引的限制)。

您需要重新考虑算法。

您无法在Java中创建大小大于最大正int 数组 ,因为数组索引是int 。 (对于各种List实现也是如此 。您可以创建一个包含更多条目的[例如LinkedList ],但是getsize类的东西开始工作不正常,你只能通过iterator得到以后的条目[假设事情不仅仅是普通的rest],这需要一段时间。)

你似乎不太可能真的需要创建一个超过2,147,483,647条的空间boolean数组,但如果你真的这样做,你将不得不创建多个数组,并通过获取索引的模数来选择正确的数组(这将是需要很long )。 (或者使用一些非JDK库,如果存在这样做的话。)这将需要像4G的RAM。 可行,但可能性非常高,不同的方法完全会更好。

但1,000,000,000,000元素? 这将需要大约1-2 TB的RAM。 正如NPE所说,如果你不是在超级计算机上运行,​​那么你就不会拥有它。

如何使用HashMap并使用长键和布尔值。

你有几个优点。
1.您可以使用长范围内的索引
2.您不必担心使用的项索引的最大大小。 只要它很长,它就会起作用
3.您不预先为整个集合分配内存。 相反,您将只使用您需要的内存。

您可以创建一个抽象,例如数组数组(您甚至可以修改它)。

Object [] []可以是布尔值或其他。

 class LargeArray { private final long size; private final int sizeI; private final int sizeJ; private final Object [][] objects; public LargeArray() { sizeI = 3;//Any reasonable value; sizeJ = Integer.MAX_VALUE; objects = new Object [sizeI][sizeJ]; size = sizeI * sizeJ; } public long size() { return size; } public Object get(long index) { int i = index / sizeJ; int j = index % sizeJ; return objects[i][j]; } public void set(long index, Object object) { int i = index / sizeJ; int j = index % sizeJ; objects[i][j] = object; } } 

您也可以更改第一个维度,例如3.在这种情况下,对象[3] [Integer.MAX_VALUE],您可以创建(2 ^ 31 -1)* 3 = 2,147,483,647 * 3 = 6442450941元素,您将需要(2 ^ 31 – 1)* 3 * 4 = ~23 GB RAM,这实际上是可能的!!! 🙂

首先:你真的需要一个很好的理由来分配这么多的内存。 正如其他人所说,你可能想重新考虑这种方法。

一些建议:将分配的数量限制为某个最大值或将其存储在文件中并寻找数据或根据需要进行分配(延迟分配)。 如果数据稀疏(很少有实际的布尔值,但是分布非常广泛),那么你最好使用地图。 如果它主要是零,考虑只存储那些:)

第二:理论上,如果你打包这个位,理论上可以分配8 *最大数组大小的布尔值。 请参阅此讨论以获取灵感: 在Java中实现C样式位域