2012-08-04 88 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不能用于修改基元数组中的值。即使在对象数组中,也可以修改对象的内容,但不能修改存储在数组中的引用。