2012-08-04 91 views
1

下面的代碼中的bool爲真,另一半的二維數組分配大約一半的值設置爲false:的foreach二維數組賦值

boolean[][] btab = new boolean[10][10]; 
for (int row = 0; row < btab.length; row++) { 
    for (int col = 0; col < btab[row].length; col++) { 
     btab[row][col] = (Math.random() < 0.5); 
    } 
} 

我使用foreach循環會做同樣的事情,想到了下面的代碼...

boolean[][] btab = new boolean[10][10]; 
for (boolean[] row : btab) { 
    for (boolean b : row) { 
     b = (Math.random() < 0.5); 
    } 
} 

但二維數組中所有的值都是假的,我猜意味着,無論是分配正義是不會發生或b是布爾值的副本,我想分配給,而不是對它的引用。任何人都可以解釋發生了什麼?

+2

感謝您的快速回復。作爲參考,Java規範的相關位是[here](http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.14.2)。 – njm 2012-08-05 00:00:26

回答

4

對於原語(如布爾類型),您的猜測是正確的,增強的for中的變量只是數組中實數值的副本。

當涉及到對象時,您將獲得參考值(而不是實際對象)的副本,因此您可以修改其內容,但不能替換對象,即創建新實例並替換實際對象。示例:

List<SomeClass> lstSomeClass; 
//create and fill the list... 
for(SomeClass sc : lstSomeClass) { 
    //this will modify the current sc object data 
    sc.setSomeAttribute(someNewValue); 
    //this will compile but it won't replace the currenct sc object in the list 
    sc = new SomeClass(); 
} 

如果要使代碼正常工作,請使用第一種方法填充數組。

3

Foreach循環返回數組元素的值,而不是對它的引用。 Foreach不能用於修改基元數組中的值。即使在對象數組中,也可以修改對象的內容,但不能修改存儲在數組中的引用。