为什么不能通过Java中的引用来调整数组的大小?

Bra*_*FRZ 2 java arrays pass-by-reference

我正在玩数组并以不同的方式操纵它们,我偶然发现了一些非常奇怪的行为!我最初担心的是将一个数组替换为另一个可能或可能不同的数组,因为它将从一个任意长度的文件中读取.我决定玩不同的东西,看看会发生什么.我的第一次尝试是这样的:

public class RewriteArray {
    public static void main(String[] args) {
        String[] arr = { "1", "2", "3"};

        System.out.print("Before rewrite: ");
        for (String str : arr)
            System.out.print(str + " ");
        System.out.println();

        changeArr(arr);

        System.out.print("After rewrite:  ");
        for (String str : arr)
            System.out.print(str + " ");
        System.out.println();
    }

    private static void changeArr(String[] arr) {
        arr[0] = "3";
        arr[1] = "2";
        arr[2] = "1";
    }
}
Run Code Online (Sandbox Code Playgroud)

这完成了我的预期,通过引用对象证明了更改,并给出了输出:

Before rewrite: 1 2 3
After rewrite:  3 2 1
Run Code Online (Sandbox Code Playgroud)

然后我尝试在changeArr方法中调整数组大小,这就是事情变得怪异的时候.

public class RewriteArray {
    public static void main(String[] args) {
        String[] arr = { "1", "2", "3"};

        System.out.print("Before rewrite: ");
        for (String str : arr)
            System.out.print(str + " ");
        System.out.println();

        changeArr(arr);

        System.out.print("After rewrite:  ");
        for (String str : arr)
            System.out.print(str + " ");
        System.out.println();
    }

    private static void changeArr(String[] arr) {
        arr = new String[4];
        arr[0] = "3";
        arr[1] = "2";
        arr[2] = "1";
        arr[3] = "0";
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望arr被新大小的新对象替换,然后重写.相反,我得到了:

Before rewrite: 1 2 3
After rewrite:  1 2 3
Run Code Online (Sandbox Code Playgroud)

没有错误或任何东西,但数组中没有任何变化!然后我尝试通过创建一个临时数组并重新分配指针来调整初始数组的大小.

private static void changeArr(String[] arr) {
    String[] tempArr = new String[4];
    tempArr[0] = "3";
    tempArr[1] = "2";
    tempArr[2] = "1";
    tempArr[3] = "0";
    arr = tempArr;
}
Run Code Online (Sandbox Code Playgroud)

同样,输出与之前的版本相同!没有错误,但也没有变化.为了完全确定它至少可以调整数组的大小,我尝试在一个单独的方法中创建一个临时数组并返回该数组.

public class RewriteArray {
    public static void main(String[] args) {
        String[] arr = { "1", "2", "3"};

        System.out.print("Before rewrite: ");
        for (String str : arr)
            System.out.print(str + " ");
        System.out.println();

        arr = loadArr();

        System.out.print("After rewrite:  ");
        for (String str : arr)
            System.out.print(str + " ");
        System.out.println();
    }

    private static String[] loadArr() {
        String[] tempArr = new String[4];
        tempArr[0] = "3";
        tempArr[1] = "2";
        tempArr[2] = "1";
        tempArr[3] = "0";

        return tempArr;
  }
}
Run Code Online (Sandbox Code Playgroud)

这次终于奏效了!我得到以下输出:

Before rewrite: 1 2 3
After rewrite:  3 2 1 0
Run Code Online (Sandbox Code Playgroud)

在这一点上看来,最好是必须在单独的方法中创建新的临时数组并返回该数组,然后将返回的数组分配给原始数组.我只是不明白为什么它不在changeArr内部使用该方法.这不是内部传递引用吗?如果不是,为什么我的第一次尝试工作而其他人没有?

SLa*_*aks 5

Java 按值传递引用

更改参数以引用新实例对作为参数传递的表达式没有影响.

  • 这意味着:您可以更改数组内部的值(并且调用者将看到它,因为它仍然是相同的数组),但是如果您将局部变量更改为新数组,则调用者不关心. (2认同)