我有一个多维数组,如:
private static ArrayList [] [] pVTable = new ArrayList [35] [12];
我第一次尝试初始化它是:
for (ArrayList[] x : pVTable) {
for (ArrayList y : x) {
y = new ArrayList<TableValue>();
}
}
哪个不起作用。
我最终手动完成了这项工作,如:
for ( int i = 0; i < pVTable.length; i++) {
for ( int j = 0; j < pVTable[0].length; j++) {
pVTable [i] [j] = new ArrayList<TableValue>();
}
}
工作正常。
虽然我有一个解决方案,但我想知道为什么第一个(更优雅的)代码不能做同样的工作?
答案 0 :(得分:1)
在第一个示例中,您的代码虽然修改 y 但不更改 x 。
答案 1 :(得分:1)
你正在将ArrayList(集合api的一部分)与Arrays混合在一起,这对我来说相当混乱(对我而言)
我会建议这样的事情:
List<Point> myShape = new ArrayList<Point>;
其中point包含两个代表X和Y的整数。
答案 2 :(得分:1)
在第一个代码段中,如果我们删除foreach
运算符(:
)的语法糖,则代码转换为:
for (int xIndex = 0; xIndex < pVTable.length; xIndex++) {
ArrayList[] x = pVTable[xIndex];
for (int yIndex = 0; yIndex < x.length; yIndex++) {
ArrayList y = x[yIndex];
y = new ArrayList<TableValue>();
}
}
如您所见,实际数组中没有任何内容 - 仅分配给临时y
变量。
答案 3 :(得分:0)
第一个的范围不正确。 y
只是一个占位符变量。更改它不会更改基础对象,只会更改y
引用的对象。您可以在以下代码段中看到相同的问题:
public static int x = 2;
public static void foo(int y) {
y = 3;//does nothing outside of foo
}
public static void main(String[] args) {
System.out.println(x);//prints 2
foo(x);
System.out.println(x);//prints 2, x hasn't changed.
}