2017-05-05 178 views
2

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

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循环或数组引用。 在此先感谢!

+0

你预期结果会是什么? –

+1

我以为它会返回一个平方的元素的数组。 –

+5

查看[JLS](https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.14.2),其中显示“增强的for语句是等效的到表格的基本声明:“。你正在平方一个新变量,而不是数组元素。 –

回答

4

查找范围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循环明确:的JVM是如何工作将帮助

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

我怀疑这会帮助有人问这个问题。 – BPS

+0

我提出了你的答案,并编辑了我自己接受的答案。谢谢! – jschnasse

1

的工作心智模式。

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

双变量的值是双精度值。

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

当你

value = Math.pow(value, 2.0); 

你只是改变了value变量(副本)的值。这对阵列没有影响,因为阵列中的值被复制到value的值中,并且该值由分配更改。

0

你应该但回到数组或只是创建新的数组,存储所有pow值,并返回此数组。