Java for循环值或引用

No3*_*o3x 9 java for-loop reference

我在我的代码中发现了一个问题.首先是代码:

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

}
Run Code Online (Sandbox Code Playgroud)

输出是:

a
b
c
over
over
over
Run Code Online (Sandbox Code Playgroud)

我假设第一个循环也会覆盖数组中的String.所以输出在任何情况下都会结束.它似乎创建了值的副本而不是创建引用.我从未察觉过这一点.我做错了吗?是否有选项来创建引用?

//编辑:除了我之外,似乎每个人都知道这一点.我来自C背景,并没有足够重视与C非常不同的术语参考.幸运的是,我花了10分钟来计算出来(这一次).

Ada*_*zyk 18

这个:

for (String s : blablubb) {
     s = "over";
}
Run Code Online (Sandbox Code Playgroud)

等于这个:

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

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

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

for (int i = 0; i < blablubb.length; i++) {         
    blablubb[i] = "over";
}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,你只需要一行打印一个数组:

System.out.println(Arrays.toString(blablubb));
Run Code Online (Sandbox Code Playgroud)


cyo*_*yon 5

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

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

希望从中您可以看到,您所做的只是在s不更改blablubb[i]. 这解释了您看到的输出。