1

当我学习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
    }
}

这里发生了什么?

编辑 感谢您的回复,我特此明白为什么不可能的事情实际上并没有发生。

4

4 回答 4

7

您没有更改数组的大小。您只是将引用更改为指向内存中的不同数组。

于 2013-08-09T15:34:30.123 回答
0

数组根本不改变大小,你正在做的是让变量改变引用,他们只会改变他们指向的数组而不改变这些数组的大小。

于 2013-08-09T15:36:01.333 回答
0

正如 Juned 所说,您只是在更改参考,因此您不需要如此复杂的示例来演示。即使这样就足够了:

int[] smallArr = new int[5];
int[] bigArr = new int[5000];
smallArr = bigArr;
System.out.println(smallArr.length); // -> prints 5000... 

但是我们仍然没有更改静态数组的长度,只是将引用的位置更改为smallArr引用的位置bigArr

于 2013-08-09T15:40:41.390 回答
0

在你的第二个块中,当你有这条线时,你给了 'assignedLater' 一些维度:

private static String[][] assignedLater = new String[2][0];

但是,在你的 main 函数中,你将它指向不同的数组,所以旧的维度不再重要:

assignedLater = smallArray;

在此之后,任何对 assignedLater 索引的调用都将指向 smallArray 索引。(直到您稍后再次重新分配它)。等等。

于 2013-08-09T15:48:13.160 回答