Java for循环值或引用

时间:2013-07-31 11:47:32

标签: 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);
        }
    }

}

输出结果为:

a
b
c
over
over
over

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

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

6 个答案:

答案 0 :(得分:17)

这:

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

等于:

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

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

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

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

顺便说一下,你可以用一行打印一个数组:

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

答案 1 :(得分:4)

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

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

希望您可以看到,您正在做的就是在不更改s的情况下将不同的值重新分配给blablubb[i]。这解释了您看到的输出。

答案 2 :(得分:1)

for-each循环不会修改它迭代的对象集合中包含的对象。它传递的值不是参考值。

答案 3 :(得分:0)

 s = "over"; 

只是更改s的引用而不是数组中的String。

blablubb[i] = "over";

更改存储在数组中第i个位置的值

答案 4 :(得分:0)

for(String s : StringArray)
{
}

就像

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

答案 5 :(得分:0)

如果你想进行低级优化,知道如何,你必须查看Java代码和内部字节代码(编译代码)

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

等于:

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

这就是输出的原因。