据我了解,java中的二维数组是数组的数组。与通常的数组表示法类似,我希望这表示
int[][]
实际上是
(int[])[]
(一个int数组)。 因此,我希望数组的长度
int[][] array = new int[2][3]; // (int[2])[3]
为3(因为它将是长度为2的数组中长度为3的数组)。 但是,事实似乎恰恰相反。
我试图为此找到一个解释,但未能成功。我找到了很多文章,解释了如何初始化多维数组,它们是数组的数组,但是我找不到任何解释为什么索引顺序如此工作的解释。
我的唯一理论是,人们发现首先迭代左索引更为自然,并且Java的构建方式使该操作更有效,因此开发人员非常有意识地做出了选择。
我很感谢任何证实这一解释的消息来源或以其他方式解释这种解释的原因。
编辑:由于似乎有人对为什么有人会认为反过来使用索引会是个好主意有些困惑,所以这里有一些澄清:
对于类型T
,表达式new T[5]
通常产生大小为5的数组。类型int[]
似乎是非常好的类型,但是Java不允许我说{ {1}},而是强迫我使用new (int[])[5]
初始化此数组数组。我一直在寻找Java对我这样做(并得到一个)的原因。
对于想像我这样的人,我想补充(非常好)答案的另一件事:在这个世界上,从来没有人考虑过二维数组,并且允许您创建{{ 1}},就像创建其他数组一样,以下代码可能是完全合法的代码。
new int[5][]
这当然完全是令人困惑的,所以我很高兴多维数组得到特殊处理。
答案 0 :(得分:4)
类似new int[2][5]
的表达式将创建一个长度为2的外部数组,每个元素都引用一个长度为5的数组,因此总共创建了3个数组。 Java语言规范Example 15.10.2-2. Multi-Dimensional Array Creation中对此进行了详细记录:
声明:
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的引用数组。
因此,对 lookup 值的表达式从左到右进行求值,例如x[2][5]
的意思是(x[2])[5]
,即在int[][] x
变量中,查找x[2]
(它是int[]
的查找5
,在该数组中,索引值为int[][] x = new int[9][9];
// z = x[2][5]
int[] y = x[2];
int z = y[5];
的查找值
CreateDeformation Layer
答案 1 :(得分:2)
您可能会将Java中的二维数组视为数组的数组。考虑下面的常规2D数字数组:
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};
希望清楚的是2D数组实际上是什么;它是一个数组数组,所以我们可以将其可视化为:
[ ] -> [1, 2, 3]
[ ] -> [4, 5, 6]
[ ] -> [7, 8, 9]
也就是说,数组的第一个索引中大小为3的每个元素(对应于行)指向另一个1D数组,其对应于列。请注意,在Java中,二维数组可以是锯齿形的,这意味着我们也可以这样做:
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在下面的评论中提出的担忧,上述2D数组最左边部分的大小为3,这与我们绘制时所看到的一致。即,我们看到一个带有3个存储桶的1D数组,每个存储桶都指向另一个大小相同的1D数组。
答案 2 :(得分:2)
这样做的原因是数组访问的重要性。您有一个数组数组(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[][][]
,而下一个元素是int[]
。当您不知道子数组array[][][][i]
的维数且子数组甚至不一定具有{一致的尺寸。