零长度多维数组

时间:2016-01-14 12:58:45

标签: java arrays

我知道类似的问题已被多次询问并且很好地回答了但是......它们是关于1维的零长度数组,如:

int[] array = new int[0];

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

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

当然,就像在简单的1D情况下,如果我们尝试迭代或者其他东西,我们从这样的数组中得不到任何东西,我只是因为它看起来对我来说非常讨厌。 :-) 为这样一个没有意义的生物分配了多少记忆?

3 个答案:

答案 0 :(得分:31)

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

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

已编辑添加:

正如评论中所指出的,这种检查甚至不可能,因为数组长度不是类型信息的一部分,可以在运行时给出。所以,除了特殊情况"当源代码中直接有int[0]时,编译器甚至无法知道它是否为零长度数组。

答案 1 :(得分:23)

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

为什么允许?出于与一维阵列的情况相同的原因。如果您创建这样的数组:

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

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

答案 2 :(得分:8)

[5]实际上做了一些有用的事情:最外面的数组将有五个长度为0的元素数组。

但你对[9]说得对。它没有做任何事情:由于所有五个中间数组都是空的,因此不会创建长度为9的数组。可以将任何整数放在那里以达到完全相同的效果。

该语言可以设计为如果有一个级别的嵌套数组,其维度设置为文字0,那么所有后续级别也必须设置为文字0。但这将在规范和实施中创造另一个特殊情况,其好处将非常小。