为什么我不能使用foreach循环将1D数组分配给2D数组?

时间:2014-04-07 16:28:43

标签: java arrays foreach

我有一个返回1D数组的方法。我想在循环中调用该方法并将结果存储在2D数组中。当使用foreach循环时,它不起作用,数组结果充满了空指针。

//this doesn't work
...
double[][] results = new double[20][];
for(double[] result : results){
        result = method();
}
...
public double[] method(){
        double[] ret = new double[15];
        //populate ret and do other stuff...
        return ret;
}

但是当使用常规"用于"循环迭代数组它神奇地工作!

...
double[][] results =  new double[20][];
for(int i=0;i<20;i++){
        results[i]=method();
}
...   
public double[] method(){
        double[] ret = new double[15];
        //populate ret and do other stuff...
        return ret;
}

为什么?

3 个答案:

答案 0 :(得分:4)

因为在增强的for循环中,您可以访问分配给变量的数组的每个对象引用的副本,并且您正在修改此变量的值,而不是其内容。

for (double[] result :  results) {
     //here result is just a copy of results[0], results[1] and on...
     //if you modify value of result i.e. assigning a new value
     //you're just changing the value of the current variable
     //note that if you modify an object inside the variable is reflected
     //since you're updating the state of the reference, which is valid
}

此代码可以在某种程度上翻译为:

for (int i = 0; i < results.length; i++) {
     double[] result = results[i];
     //this explains why the enhanced for doesn't work
     result = method();
}

答案 1 :(得分:2)

因为,在循环中,result是存储在数组中的引用的副本。然后为此副本分配一个新数组。因此,初始引用保持不变:

在作业之前

results[i] ----> null
                  ^
result -----------|

转让后:

results[i] ----> null

result --------> double array

答案 2 :(得分:0)

它在第一个示例中不起作用,因为在将1D数组分配给2D数组时没有使用索引:

result = method();

这里的结果只是一个局部变量,其范围是foreach循环,所以你只是将数组赋给这个局部变量。 2D阵列保持不变。

您可以使用带有手动索引的foreach管理它,在进入循环之前设置为0并手动递增它。但在这种情况下,经典的for循环可能更适合。