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

时间:2013-03-26 06:48:25

标签: 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)的数组,对吗?内存方面没有让我更早出现。采取不同的方法。

5 个答案:

答案 0 :(得分:11)

您无法在Java中创建大小超过最大正int的数组,因为array indexes are int。 (同样适用于各种List implementations。您可能能够创建一个包含更多条目[例如LinkedList],但get之类的内容并且size开始工作不正常,你只能通过iterator [假设事情不仅仅是简单的休息]来获得以后的条目,这需要一段时间。)

您似乎不太可能需要创建一个boolean数组,其中包含超过2,147,483,647个条目的空间,但如果您真的这样做,则必须创建多个数组并选择正确的数组。索引的模数(需要为long)。 (或者使用一些非JDK库,如果存在这样做。)这将需要像4G的RAM。可行,但可能性很高,不同的方法完全会更好。

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

答案 1 :(得分:7)

  

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

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

您需要重新考虑算法。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

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,这实际上是可能的!!! :)

答案 4 :(得分:0)

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

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

第二:理论上,如果打包这些位,理论上可以分配8 *最大数组大小的布尔值。请参阅此讨论以获取灵感:Implementing a C style bitfield in Java