Java for loop by value or by reference

2022-09-04 06:23:59

我发现我的代码中有一个问题。首先是代码:

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String[] blablubb = { "a", "b", "c" };

        for(String s : blablubb) {
            s = "over";
        }
        printArray(blablubb);


        for (int i = 0; i < blablubb.length; i++) {
            blablubb[i] = "over";
        }
        printArray(blablubb);

    }

    public static void printArray(String[] arr) {
        for( String s : arr ) {
            System.out.println(s);
        }
    }

}

输出为:

a
b
c
over
over
over

我假设第一个循环也会覆盖数组中的字符串。因此,无论如何,输出都将结束。它似乎创建了值的副本,而不是创建引用。我从未察觉到这一点。我做错了吗?是否有创建引用的选项?

编辑:似乎除了我之外,每个人都知道这一点。我来自C背景,对与C非常不同的术语引用没有给予足够的关注,幸运的是,我只花了10分钟就弄清楚了(这次)。


答案 1

这:

for (String s : blablubb) {
     s = "over";
}

等于:

for (int i = 0; i < blablubb.length; i++) {
     String s = blablubb[i];
     s = "over";
}

这将创建一个临时字符串,其中包含数组中值的副本,并且您仅更改副本。这就是内容保持不变的原因。blablubb[]

如果要更改数组中的值,只需使用第二个选项:

for (int i = 0; i < blablubb.length; i++) {         
    blablubb[i] = "over";
}

顺便说一句,您可以只打印一行数组:

System.out.println(Arrays.toString(blablubb));

答案 2

您的循环等效于以下代码:for(String s : blablubb)

for(int i = 0; i < blablubb.length; i++ ) {
    String s = blablubb[i];
    s = "over";
}

希望从中可以看出,您所做的只是重新分配不同的值而不更改 。这解释了您看到的输出。sblablubb[i]