从我的理解到Java中的二维数组我知道它可以像这样初始化:
int a[][] = new int[3][1];
3->代表行
1->代表col
如图:
我的问题是为什么当我使用它时:
int a[][] = new int[3][1];
a[4] =new int[]{1,2,3,3,4};
System.out.print(a[4][4]);
它给出了:
ArrayIndexOutOfBoundsException:由于大小为3,这是[4]超出索引的正确行为。
但是使用它不会产生任何异常:
int a[][] = new int[3][1];
a[1] = new int[]{1,2,3,3,4};
a[2] = new int[]{4,5};
System.out.print(a[1][4]);
即使初始化确实存在1 [4],但由于col的大小等于1,因此它超出了索引。
任何想法!
感谢。
答案 0 :(得分:4)
分配时
a[1] = new int[]{1,2,3,3,4};
a[1]
现在引用一个包含5个元素的int数组,因此a[1][4]
有效。与原始a[1]
引用的1个元素的int数组相比并不重要,因为在赋值之后,a[1]
引用了一个新数组。
你应该记住,二维数组实际上是一个数组数组(即元素类型为数组的数组)。因此,您可以将新的内部数组分配给外部数组的任何索引。
答案 1 :(得分:1)
那是因为二维数组实际上是Array of Arrays
。
所以,当你这样做时,
int a[][] = new int[3][1];
转换为,
a[0] = new int[1];
a[1] = new int[1];
a[2] = new int[1];
不是,作为数组的a
只有一个维度。但是它中的每个元素都可以包含另一个的任何长度的数组,但是int类型。
所以,当你这样做时,
a[1] = new int[5];
它仍然有效。
答案 2 :(得分:0)
您已声明[1]为"新"这将覆盖数组大小计数