1

以下代码将 2d 布尔数组中大约一半的值分配给 true,另一半分配给 false:

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);
    }
}

但是 2d 数组中的所有值都是错误的,我猜这意味着赋值只是没有发生,或者 b 是我要分配的布尔值的副本,而不是对它的引用。谁能解释发生了什么?

4

2 回答 2

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();
}

如果你想让代码工作,使用第一种方式来填充数组。

于 2012-08-04T23:44:20.193 回答
3

Foreach 循环返回数组元素的值,而不是对它的引用。Foreach 不能用于修改基元数组中的值。即使在对象数组中,您也可以修改对象的内容,但不能修改存储在数组中的引用。

于 2012-08-04T23:45:39.713 回答