2014-09-05 96 views
5

我一直在測試一些不同的方式來乘以一個常量數組的項目。Java數組循環行爲

我也取決於產生不同的結果如何我遍歷數組,我無法理解這一點(我是相當新的Java和仍然讓我周圍的事物,如何傳遞或引用頭)。

測試1

int[] array = {1, 2, 3, 4}; 

for (int number : array) 
{ 
    number *= 2; 
} 

從而造成未修改的數組項:

{1, 2, 3, 4} 

好像number是不實際的數組元素,但被初始化它一個新的int的價值。那是對的嗎?


試驗2

我認爲,通過使用對象可能工作的陣列,假設number然後到實際的數組項的引用。這是我在使用Integer的測試,而不是int

Integer[] array = {1, 2, 3, 4}; 

for (Integer number : array) 
{ 
    number *= 2; 
} 

再次,導致數組項不變:

{1, 2, 3, 4} 

測試3

經過一番撓頭我嘗試了不同的方法循環,​​例如:

int[] array = {1, 2, 3, 4}; 

for (int i = 0; i < array.length; i ++) 
{ 
    array[i] *= 2; 
} 

在數組項所得乘以:

{2, 4, 6, 8} 

這最後的結果對我來說很有意義,但我不明白,從第二次測試的結果(或第一爲此事)。到現在爲止,我一直認爲測試1和測試2中使用的循環只是測試3中使用的循環的簡寫版本,但它們明顯不同。

爲什麼沒有這方面的工作如我所料?爲什麼這些循環不同?

+0

,你正在做的像陣列[0] = array [0] * 2;即你用新的相乘值替換數組。 – 2014-09-05 04:04:36

+0

跟我說說 - Java是通過價值傳遞的。 Java是通過價值傳遞的。 Java是通過價值傳遞的。 – csmckelvey 2014-09-05 04:39:16

回答

6

這是因爲增強for環陣列中使用的值的副本。在

for (int number : array) { 
    number *= 2; 
} 

的代碼是類似於:使用Integer[]

for(int i = 0; i < array.length; i++) { 
    int number = array[i]; 
    number *= 2; 
} 

同樣的情況。

此外,當使用有增強for環在Iterable例如List,它使用迭代器代替。這意味着,像這樣的代碼:

List<Integer> intList = new ArrayList<>(); 
intList.add(1); 
intList.add(2); 
intList.add(3); 
intList.add(4); 
for(Integer i : intList) { 
    i *= 2; 
} 

是類似於:

for(Iterator<Integer> it = intList.iterator(); it.hasNext();) { 
    Integer i = it.next(); 
    i *= 2; 
} 

相關信息:

在第三種情況下