为了账号安全,请及时绑定邮箱和手机立即绑定

Java 中二维数组创建的维度似乎倒退了

Java 中二维数组创建的维度似乎倒退了

一只斗牛犬 2021-12-01 15:31:48
据我了解,java中的二维数组是数组的数组。类似于通常的数组符号,我希望这意味着int[][]实际上是(int[])[](一个 int 数组的数组)。因此我希望数组的长度int[][] array = new int[2][3]; // (int[2])[3] 为 3(因为它将是长度为 3 的数组的长度为 2 的数组)。然而,情况似乎正好相反。我试图为此找到解释,但无法找到。我发现很多帖子解释了如何初始化多维数组,并且它们是数组的数组,但我找不到任何关于索引顺序为何以这种方式工作的解释。我唯一的理论是,人们发现先迭代左索引更自然,而 Java 的构建方式使得此操作更有效,因此开发人员非常慎重地做出了这个选择。我很感谢任何确认这种解释的消息来源或任何其他原因。编辑:由于对于为什么有人会相信以相反的方式使用索引是一个好主意似乎有些困惑,这里有一些澄清:对于一个类型T,表达式new T[5]通常产生一个大小为 5 的数组。该类型int[]似乎是一个非常好的类型,但是 Java 不允许我说new (int[])[5],而是强制我使用new int[5][]. 我一直在寻找 Java 对我这样做的原因(并得到了一个)。对于像我这样思考的人的(非常好的)答案,我想补充的另一件事是:在一个没有人考虑过二维数组的世界中,您可以int[]像创建任何类型的数组一样创建类型的数组其他数组,以下可能是完全合法的代码。    int[][] = new (int[])[5];    int[] firstArray = new int[3];    int[0] = firstArray;    int[0][2] = 1; // last element of first array    int[0][4] = 2; // IndexOutOfBoundsException, trying to access 5th element of firstArray这当然会完全令人困惑,所以我很高兴多维数组得到了特殊处理。
查看完整描述

3 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

表达式 likenew int[2][5]将创建一个长度为 2 的外部数组,每个元素引用一个长度为 5 的数组,因此总共创建了 3 个数组。这在 Java 语言规范示例 15.10.2-2 中有详细记录。多维数组创建:


声明:


float[][] matrix = new float[3][3];

在行为上等同于:


float[][] matrix = new float[3][];

for (int d = 0; d < matrix.length; d++)

    matrix[d] = new float[3];

这并不意味着(int[2])[5],即 5 个引用数组的数组 2。


因此,查找值的表达式从左到右求值,例如x[2][5]mean (x[2])[5],即在int[][] x变量 lookup 中x[2],它是 an int[],在该数组查找值中的 index 5。


int[][] x = new int[9][9];

// z = x[2][5]

int[] y = x[2];

int z = y[5];


查看完整回答
反对 回复 2021-12-01
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

这样做的原因是数组访问的重要性。您有一组数组 ( int[][])。然后从中检索一个数组 ( int[])。然后从那个 ( int) 中检索一个元素。


有两种方法可以做到这一点。第一个是最重要的:


for (int i = 0; i < matrix.length; i++) {

    int[] row = matrix[i];

    for int j = 0; j < row.length; j++) {

        int element = row[j];

    }

}

必须int[] row = matrix[][i];在第一个示例中使用是荒谬的,因为约定是array[i]代表 的第一个元素array。在这种情况下,的第一个元素array是一行,而不是一个元素。


始终一致地应用相同的索引排序。


这也符合这样一个事实,即您可以使用Object[]数组拥有一个奇怪维度的类矩阵对象。也许该数组的一个元素将是int[][][]while 下一个将是int[]。必须以某种方式弄清楚是否放置array[][][][i]或array[][i]当您不知道子数组的维数i并且子数组甚至不一定具有一致的维数时,这会有点奇怪。


查看完整回答
反对 回复 2021-12-01
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

您可能会将 Java 中的二维数组视为数组的数组。考虑以下一般二维数字数组:


1 2 3

4 5 6

7 8 9

我们可以将这个数组定义为:


int[][] array = new int[][] {{1,2,3}, {4,5,6}, {7,8,9}};

或者,我们可以使用一个空的构造函数,然后填充各个值:


int[][] array = new int[3][3];

array[0][0] = 1;

array[0][1] = 2;

// etc.

但是为了更好地理解 Java 中的 2D 数组是如何工作的,请考虑以下方法:


int[][] array = new int[3][];

arr[0] = new int[] {1, 2, 3};

arr[1] = new int[] {4, 5, 6};

arr[2] = new int[] {7, 8, 9};

希望很清楚二维数组实际上是什么;它是一个数组数组,因此我们可以将其可视化为:


[ ] -> [1, 2, 3]

[ ] -> [4, 5, 6]

[ ] -> [7, 8, 9]

也就是说,数组的第一个索引中的每个元素,大小为 3,对应于行,指向另一个 1D 数组,对应于列。请注意,在 Java 中,二维数组可以是jagged,这意味着我们也可以这样做:


int[][] array = new int[3][];

arr[0] = new int[] {1, 2, 3, 4, 5};

arr[1] = new int[] {1, 2, 3};

arr[2] = new int[] {7, 7, 7};

为了解决@Henry 在下面的评论中提出的问题,上面二维数组最左边部分的大小为 3,这与我们在绘制时看到的一致。即,我们看到一个具有 3 个桶的一维数组,每个桶都指向另一个具有某种大小的一维数组。


查看完整回答
反对 回复 2021-12-01
  • 3 回答
  • 0 关注
  • 167 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信