【问题标题】:Java for loop by value or by referenceJava for循环按值或按引用
【发布时间】:2013-07-31 11:47:31
【问题描述】:

我在我的代码中发现了一个问题。先上代码:

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 分钟就弄清楚了(这次)。

【问题讨论】:

标签: java for-loop reference


【解决方案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";
    }
    

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:
         s = "over"; 
        

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

        blablubb[i] = "over";
        

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

        【讨论】:

          【解决方案5】:
          for(String s : StringArray)
          {
          }
          

          就像

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

          【讨论】:

            【解决方案6】:

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

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

            等于:

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

            这就是为什么输出是这样的。

            【讨论】:

              猜你喜欢
              • 2021-12-29
              • 2016-03-20
              • 1970-01-01
              • 2012-03-12
              • 2013-09-15
              • 1970-01-01
              • 2014-01-04
              • 2020-07-30
              • 1970-01-01
              相关资源
              最近更新 更多