当我学习java时,我被告知一旦创建,数组的大小是固定的,无法更改。最近我一直在使用数组,并注意到类似下面的代码不会产生错误:
public class Test {
private static String[][] smallArray = new String[4][4];
private static String[][] biggerArray = new String[21][21];
private static String[][] assignedLater;
public static void main(String args[]){
for(int i = 0; i < smallArray.length; i++){
for(int j = 0; j < smallArray[0].length; j++){
smallArray[i][j] = i + j + "";
}
}
for(int i = 0; i < biggerArray.length; i++){
for(int j = 0; j < biggerArray[0].length; j++){
biggerArray[i][j] = i + j + "";
}
}
assignedLater = smallArray;
//last element of last row
System.out.println(assignedLater[3][3]) //returns 6
assignedLater = biggerArray;
//new last element of new last row
System.out.println(assignedLater[20][20]) //returns 40
}
}
在玩了一下之后,我最终测试了以下内容:
public class Test {
private static String[][] smallArray = new String[2][4];
private static String[][] biggerArray = new String[2][21];
private static String[][] errorArray = new String[3][21];
private static String[][] assignedLater = new String[2][0];
public static void main(String args[]){
//fill arrays as in previous example
assignedLater = smallArray;
//last element of last row
System.out.println(assignedLater[1][3]) //returns 6
assignedLater = biggerArray;
//new last element of new last row
System.out.println(assignedLater[1][20]) //returns 21
assignedLater = errorArray; //no error
System.out.println(assignedLater[2][20]); // returns 22
}
}
这里发生了什么?
修改 感谢您的回复,我特此明白了为什么不可能实际发生的事情。
答案 0 :(得分:7)
您没有更改数组的大小。您只是将引用更改为指向内存中的其他数组。
答案 1 :(得分:0)
数组根本不会改变大小,你正在做的是使变量更改引用,它们只会更改它们指向的数组,而不会改变这些数组的大小。
答案 2 :(得分:0)
正如Juned所说,你只是在改变参考,所以你不需要这么复杂的例子来证明。即使这样就足够了:
int[] smallArr = new int[5];
int[] bigArr = new int[5000];
smallArr = bigArr;
System.out.println(smallArr.length); // -> prints 5000...
但我们仍然没有改变静态数组的长度,只是将smallArr
所指的位置更改为bigArr
所指的位置。
答案 3 :(得分:0)
在你的第二个区块中,当你拥有这条线时,你给了'assignedLater'一些尺寸:
private static String[][] assignedLater = new String[2][0];
但是,在您的main函数中,您将其指向不同的数组,因此旧维度不再重要:
assignedLater = smallArray;
在此之后,对assignedLater索引的任何调用都将指向smallArray索引。 (直到你以后再次重新分配)。等等。