为什么在 Java 中声明一个非空数组的空数组是合法的?

Pav*_*nko 6 java arrays multidimensional-array

好奇为什么在 Java 中声明一个非空数组的空数组是合法的:

int[][] array = new int[0][1];

System.out.println(array[][0]); //won't compile.
System.out.println(array[0][0]) //triggers an out of bounds exception.
Run Code Online (Sandbox Code Playgroud)

PS 我已经阅读了关于零大小数组的相关问题:为什么 Java 允许大小为 0 的数组?

这是出于同样的原因吗?

PeM*_*eMa 1

一般来说,定义空数组是合法的,无论它包含什么。因此,拥有一个包含非空数组的空数组也是合法的。

从数学(群论)角度来说,空数组不仅合法,而且是必要的,因为它们代表数组串联操作的零(或中性)元素。这也使得它对于编程很有用(参见下面的示例)。

在您的示例中,您基本上会探测是否可以访问空数组的元素。这当然是不合法的,因为根本不存在。但是你可以这样做:

int[][] array = new int[0][1];
System.out.println(array.length);
Run Code Online (Sandbox Code Playgroud)

参考我自己上面的例子,一个比较有用的案例是:

    int[][] array1 = new int[1][1];
    int[][] array2 = new int[0][1];

    array1[0][0] = 1;

    int [][] concat = Stream
            .concat(Arrays.stream(array1), Arrays.stream(array2))
            .toArray(int[][]::new);

    System.out.println(Arrays.deepToString(concat));
Run Code Online (Sandbox Code Playgroud)

因此,空数组允许“好”代码,无需if排除非法情况,这实际上完全没问题。