【问题标题】:Why does the foreach statement not change the element value?为什么foreach语句不改变元素值?
【发布时间】:2013-03-28 11:44:27
【问题描述】:

为什么下面的打印是boss而不是bass?

String boss = "boss";
char[] array = boss.toCharArray();

for(char c : array)
{
 if (c== 'o')
     c = 'a'; 
}
System.out.println(new String(array)); //How come this does NOT print out bass?It prints boss.

【问题讨论】:

  • @KacyRaye 顺便说一句,这是在对象引用类上使用增强的for 循环时的类似行为(这里提出的解决方案是相同的)。

标签: java foreach


【解决方案1】:

这是因为c = 'a'a 分配给局部变量c,它没有引用array 本身的该索引处的实际值。它只包含在array 的指定索引处存在的值的副本。因此,更改实际上是在局部变量中进​​行的,而不是在 array[i] 引用的实际位置。 如果你想改变价值,你应该使用以下内容:

int i = 0;
for(char c : array)
{
 if (c== 'o')
     array[i] = 'a'; 
  i++;
}

【讨论】:

  • 那个时候使用普通的for循环不是更好吗?
【解决方案2】:

您将“a”分配给局部变量 c,而不是数组元素。要让它打印低音,你需要

for (int i = 0; i < array.length; i++) {
    if (array[i] == 'o') {
        array[i] = 'a';
    }
}

【讨论】:

    【解决方案3】:

    在“for each”循环中应用的更改仅在她的体内进行(这是因为值是复制的,而不是引用)。要处理引用,请使用“for”循环。

    【讨论】:

      【解决方案4】:

      c 的值是数组中值的副本。直接访问数组以更改有问题的值。

      【讨论】:

        【解决方案5】:

        您正在更改迭代变量c。这不会改变数组的内容。迭代变量只是数组元素的副本。如果你想修改数组,你需要明确地这样做:

        for (int i = 0; i < array.length; i++) {
            if (array[i] == 'o') {
                array[i] = 'a';
            }
        }
        

        您的原始代码(根据section 14.14.2 of the JLS)等同于:

        for (int i = 0; i < array.length; i++) {
            char c = array[i];
            if (c == 'o') {
                c = 'a'; 
            }
        }
        

        改变局部变量的值永远不会改变其他任何东西——它只是改变了局部变量。作业:

        char c = array[i];
        

        复制数组中的值到一个局部变量中。它不会永远将局部变量与数组元素相关联。

        【讨论】:

        • 哦,好的,谢谢。我不明白 c 只是一个副本。谢谢,现在说得通了。
        • @BaroudiSafwen:数组元素的副本在每次迭代中生成的。这里的“变形”是什么意思?我很困惑你在说什么。
        【解决方案6】:

        你的变量c 被改变了,但是数组的内容没有改变。要更改数组,不要使用c,直接操作数组。

        for(int i = 0; i < array.length; i++)
        {
         char c = array[i];
         if (c== 'o')
             array[i] = 'a';
        }
        

        【讨论】:

          猜你喜欢
          • 2021-11-25
          • 1970-01-01
          • 1970-01-01
          • 2018-01-21
          • 2021-11-27
          • 2015-09-08
          • 1970-01-01
          • 2023-01-02
          • 2012-11-23
          相关资源
          最近更新 更多