零长度多维数组

2022-09-01 16:42:16

我知道类似的问题已经问过好几次了,他们得到了很好的回答,但是......它们大约是1维的零长度数组,例如:

int[] array = new int[0];

似乎在 null 不应该 / 不能使用的情况下,这样的数组是有目的的。但是为什么Java允许创建这样的东西:

int[][][] multiDims = new int[5][0][9];

当然,就像在简单的1D案例中一样,如果我们试图迭代或其他东西,我们从这样的数组中得不到任何东西,我只是问,因为它对我来说看起来非常讨厌。:-)为这样一个毫无意义的生物分配了多少内存?


答案 1

至于为什么Java允许这样做 - 从语言的角度来看(而不是你试图用它表达的概念),为什么它要明确禁止这样做?如果允许任何类型的零长度数组,为什么明确不允许零长度数组 ?禁止它需要更多的编译器检查来强制执行基本上无用的规则,因为即使没有规则,行为也是很好的定义。int[9]

底线,编译器检查不是为了确保您的程序有意义。他们来这里只是为了检查它是否明确。


编辑以添加:

正如注释中指出的那样,这种检查甚至是不可能的,因为数组长度不是类型信息的一部分,可以在运行时给出。因此,除了直接在源代码中存在的“特殊情况”之外,编译器甚至没有任何手段知道它是否是一个零长度数组。int[0]


答案 2

这将创建 6 个对象 - 5 个空数组和一个包含这些数组的数组。

为什么允许这样做?原因与一维数组相同。如果创建如下数组:

int[][][] multiDims = new int[p][q][r];

其中每一种,有时可以,处理这些特殊情况将非常困难。相反,你会得到一个可以在循环中使用的合法对象(一个非常短的循环 - 一个立即结束但没有错误的循环)。pqr0