【问题标题】:Enhanced for loop traversing Java增强的 for 循环遍历 Java
【发布时间】:2017-05-05 20:15:28
【问题描述】:

我目前正在阅读 Downey 的 Think Java,它最近引入了增强的 for 循环。有人提到,增强的 for 循环在遍历数组时不考虑元素索引。我认为这不会抑制类似以下方法的工作:

    public static double[] powArray(double[] a) {
        for (double value : a) {
            value = Math.pow(value, 2.0);
        }
        return a;
    }                 

但是,它似乎确实如此(它所属的其余代码似乎很好)。请注意,当我运行以下命令时,此方法最终返回相同的数组:

    System.out.println(Arrays.toString(powArray(a)));

我想我无法理解这里的问题是否在于我如何处理增强的 for 循环或数组引用。 提前致谢!

【问题讨论】:

  • 你预计结果会是什么?
  • 我认为它会返回一个包含平方元素的数组。
  • 查看JLS,它说“增强的 for 语句等同于形式的基本 for 语句:”。您正在平方一个新变量,而不是数组元素。
  • 我认为您应该考虑接受安迪·特纳的回答。 stackoverflow.com/a/43813175/1485527 。请参阅我编辑的答案,了解原因。

标签: java for-loop reference


【解决方案1】:

查看JLS Sec 14.14.2,它给出了在数组上的增强 for 循环的等效形式:

for ( {VariableModifier} TargetType Identifier : Expression ) Statement

[相当于,如果Expression是一个数组类型]

T[] #a = Expression;
L1: L2: ... Lm:
for (int #i = 0; #i < #a.length; #i++) {
    {VariableModifier} TargetType Identifier = #a[#i];
    Statement
}

因此,您的循环被编译器转换为如下所示:

double[] a = arr;
for (int i = 0; i < a.length; i++) {
  double value = a[i];
  value = Math.pow(value, 2.0);
}

您正在平方 value,但该值从未写回 arr(或 a,甚至)。

如果要修改数组元素,则必须显式使用基本的 for 循环:

for (int i = 0; i < a.length; i++) {
  a[i] = Math.pow(a[i], 2.0);
}

【讨论】:

  • 我怀疑这会对提出这个问题的人有所帮助。
  • 我赞成您的答案并编辑了我自己接受的答案。谢谢!
【解决方案2】:

JVM 工作原理的有效思维模型会有所帮助。

数组变量的值是一个引用。

双精度变量的值是双精度。

在循环的每次迭代中,您的 value 变量会获取复制到其中的数组元素。

当你这样做时

value = Math.pow(value, 2.0);

您只是更改了value 变量(副本)的值。这对数组没有影响,因为数组中的值被复制到 value 的值中,并且正是该值被赋值更改。

【讨论】:

    【解决方案3】:

    您应该value返回数组或创建新数组,将所有 pow 值存储到其中并返回此数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      • 2020-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多