2017-05-05 214 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值,並返回此數組。