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

时间:2016-03-08 01:31:33

标签: java arrays pass-by-reference

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

Before rewrite: 1 2 3
After rewrite:  3 2 1

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

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"; } } 方法中调整数组的大小,以及当事情变得奇怪时。

arr

我原本希望Before rewrite: 1 2 3 After rewrite: 1 2 3 被新大小的新对象替换,然后重写。相反,我得到了:

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;
}

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

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;
  }
}

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

Before rewrite: 1 2 3
After rewrite:  3 2 1 0

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

changeArr

在这一点上,似乎必须在单独的方法中创建新的临时数组并返回该数组,然后将返回的数组分配给原始数组。我只是不明白它为什么不在内部使用<body ng-app="myApp"> <!--[if lt IE 7]> <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p> <![endif]--> <div ng-view></div> <div>Angular seed app: v<span app-version></span></div> <!-- In production use: <script src="//ajax.googleapis.com/ajax/libs/angularjs/x.x.x/angular.min.js"></script> --> <script src="bower_components/angular/angular.js"></script> <script src="bower_components/angular-route/angular-route.js"></script> <script src="app.js"></script> <script src="components/version/version.js"></script> <script src="components/version/version-directive.js"></script> <script src="components/version/interpolate-filter.js"></script> <script src="pages/mainPage/mainPageController.js"></script> <script src="pages/userForm/userFormController.js"></script> <script src="configuration.js"></script> </body> </html> 方法。这不是内部传递参考吗?如果不是,为什么我的第一次尝试会有效,而其他人则没有?

2 个答案:

答案 0 :(得分:5)

Java按值

传递引用

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

答案 1 :(得分:0)

changeArr()方法中,当您执行以下初始化

arr = new String[4];

您实际上已分配 local 变量以指向新分配的数组。传入的原始数组不受影响。

您无法在Java中调整数组大小。实现这一目标最接近的是使用java.lang.System.arraycopy()之类的东西来返回原始数组的放大副本。或者您可以尝试使用专为此目的而设计的ArrayList