我有一个返回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;
}
为什么?
答案 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循环可能更适合。