如何在Java中声明“无限”2D数组?

时间:2015-09-09 11:44:57

标签: java arrays

我想在程序中使用无限的2D数组。我有一个2D数组的代码:

int a[][]=new int[10][10];

但问题是数组是固定长度的,具有行和列值。

3 个答案:

答案 0 :(得分:4)

正如Kayaman评论的那样,java中的数组是固定大小,如JLS (§10.3)

中所指定
  

数组创建表达式指定元素类型,嵌套数组的级别数,以及至少一个嵌套级别的数组长度。 数组的长度可用作最终实例可变长度。

你有3个选择,如果你的情况下首先不可能,你应该使用第二个:

  1. 使用变量来提供所需的数组extact大小:

    int numberOfXElement = // get the elements in dynamic way
    int numberOfYElement = // get the elements in dynamic way
    int a[][]=new int[numberOfXElement][numberOfYElement];
    
  2. 最佳选择

    1. 使用具有动态大小的ArrayList,您可以添加元素而不需要关注大小(但直到无限,直到Integer.MAX_VALUE)。

      List<List<Integer>> yourList = new ArrayList<ArrayList<Integer>>();
      

      注意:如评论所示,请注意使用Integer and not int

      1. Integer.MAX_VALUE大小赋予数组(但必须小心空位)
        如注释中所指出的,语法上是正确的表达式,但是你需要ram内存的音调才能执行它。而不是:

        给出一个很大的数字,你在创建时永远不会到达数组,但如果你使用这个选项,你必须小心空位

        int a[][]=new int[8043][8043];
        

        为什么选择8043?我使用快速测试来查看实际机器中的最大堆大小, 2gb RAM ,不关心i启动哪个值,总是中断(在我的机器中,尝试创建{{ 1}})。

        int[8044][8044]

答案 1 :(得分:3)

阵列的大小是固定的。一旦你用一定长度声明它们,你就不能在以后更改它。

您可能希望ArrayList动态增加动态,同时继续添加项目。

如果您正在寻找2D,可以选择ArrayList的ArrayList。

List<List<Integer>> listOfLists = new ArrayList<ArrayList<Integer>>();

如果你不确切地知道为什么我在左侧写了List<List<>>而不是ArrayList<ArrayList>>,请参考Type List vs type ArrayList in Java

答案 2 :(得分:1)

不确定是否可以创建流的流,但在Java 8中,您可以拥有无​​限的流。

https://docs.oracle.com/javase/8/docs/api/java/util/stream/IntStream.html#generate-java.util.function.IntSupplier-