foreach 2d数组赋值

时间:2012-08-04 23:41:13

标签: java

以下代码将2d bool数组中大约一半的值分配给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数组中的所有值都是false,我猜这意味着要么没有发生赋值,要么b是我想要赋值的布尔值的副本,而不是对它的引用。谁能解释一下发生了什么?

2 个答案:

答案 0 :(得分: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();
}

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

答案 1 :(得分:3)

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