零长度多维数组

Krz*_*tof 25 java arrays

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

int[] array = new int[0];
Run Code Online (Sandbox Code Playgroud)

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

int[][][] multiDims = new int[5][0][9];
Run Code Online (Sandbox Code Playgroud)

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

Jir*_*sek 31

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

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


编辑添加:

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


cia*_*mej 23

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

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

int[][][] multiDims = new int[p][q][r];
Run Code Online (Sandbox Code Playgroud)

其中每一个p,q并且r可有时候0,处理这些特殊情况将是非常困难的.相反,你得到一个合法的对象,可以在一个循环中使用(一个非常短的循环 - 一个立即结束但没有错误的循环).


Lii*_*Lii 8

在[5]实际执行一些:最外面的阵列将具有长度为0个元件的阵列.

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

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

  • `[9]`实际上可能有用.也许不是功能性的,而是语义的:它意味着数组*的第三个维度应该是长度为9,如果您计划添加元素以使第二个维度停止为空,这可能很有用. (5认同)