我知道类似的问题已被多次询问并且很好地回答了但是......它们是关于1维的零长度数组,如:
int[] array = new int[0];
似乎在不应该/不能使用null的情况下存在此类数组的目的。但是为什么Java允许创建这样的东西:
int[][][] multiDims = new int[5][0][9];
当然,就像在简单的1D情况下,如果我们尝试迭代或者其他东西,我们从这样的数组中得不到任何东西,我只是因为它看起来对我来说非常讨厌。 :-) 为这样一个没有意义的生物分配了多少记忆?
答案 0 :(得分:31)
至于为什么Java允许这个 - 从语言的角度来看(不是你试图用它表达的概念),为什么它应该特别禁止这个?如果允许任何类型的零长度数组,为什么要特别禁止int[9]
的零长度数组?禁止它将需要更多的编译器检查来强制执行基本无用的规则,因为即使没有规则,行为也很明确。
底线,编译器检查不在此处以确保您的程序有意义。他们来这里只是为了检查它是否明确。
已编辑添加:
正如评论中所指出的,这种检查甚至不可能,因为数组长度不是类型信息的一部分,可以在运行时给出。所以,除了特殊情况"当源代码中直接有int[0]
时,编译器甚至无法知道它是否为零长度数组。
答案 1 :(得分:23)
这将创建6个对象 - 5个空数组和一个包含这些数组的数组。
为什么允许?出于与一维阵列的情况相同的原因。如果您创建这样的数组:
int[][][] multiDims = new int[p][q][r];
每个p
,q
和r
有时可能0
,处理这些特殊情况非常困难。相反,你得到一个合法的对象,可以在一个循环中使用(一个非常短的循环 - 一个立即结束但没有错误的循环)。
答案 2 :(得分:8)
[5]
实际上做了一些有用的事情:最外面的数组将有五个长度为0的元素数组。
但你对[9]
说得对。它没有做任何事情:由于所有五个中间数组都是空的,因此不会创建长度为9的数组。可以将任何整数放在那里以达到完全相同的效果。
该语言可以设计为如果有一个级别的嵌套数组,其维度设置为文字0
,那么所有后续级别也必须设置为文字0
。但这将在规范和实施中创造另一个特殊情况,其好处将非常小。