我有问题。
List<Color[][]> list = new ArrayList<Color[][]>();
for (int i = 0; i < 5; i++) {
if (i == 0) tab[1][1] = Color.white;
if (i == 1) tab[1][1] = Color.blue;
if (i == 2) tab[1][1] = Color.black;
if (i == 3) tab[1][1] = Color.red;
if (i == 4) tab[1][1] = Color.cyan;
System.out.println(i + " add " + tab[1][1]);
list.add(tab);
}
System.out.println("_");
for (int i = 0; i < 5; i++)
System.out.println(i + ". read " + list.get(i)[1][1]);
输出是:
0 add java.awt.Color[r=255,g=255,b=255]
1 add java.awt.Color[r=0,g=0,b=255]
2 add java.awt.Color[r=0,g=0,b=0]
3 add java.awt.Color[r=255,g=0,b=0]
4 add java.awt.Color[r=0,g=255,b=255]
0. read java.awt.Color[r=0,g=255,b=255]
1. read java.awt.Color[r=0,g=255,b=255]
2. read java.awt.Color[r=0,g=255,b=255]
3. read java.awt.Color[r=0,g=255,b=255]
4. read java.awt.Color[r=0,g=255,b=255]
为什么列表只返回最后一个数组?
答案 0 :(得分:4)
您只有一个tab
实例,并存储5个引用。然后您更改tab
,更改会反映在所引用的任何位置。
换句话说,System.out.println(i+" add "+tab[1][1]);
在每次添加时打印制表符的状态,在每次循环迭代后不同,System.out.println(i+". read "+list.get(i)[1][1]);
打印最后一次添加后的状态,在迭代之间不会改变各自的循环。
答案 1 :(得分:0)
您在这里更改相同参考的值, 因此,最后的价值被忽略了。 所以在for循环中为Color [] []创建新对象。
答案 2 :(得分:-1)
因为您总是在1,1处添加元素并添加相同的标签5次。相反,我认为你需要:
for(int i=0;i<5;i++){
if(i==0) tab[i][i] = Color.white;
if(i==1) tab[i][i] = Color.blue;
if(i==2) tab[i][i] = Color.black;
if(i==3) tab[i][i] = Color.red;
if(i==4) tab[i][i] = Color.cyan;
System.out.println(i+" add "+tab[i][i]);
}
list.add(tab); //add just once
并打印如下:
for(int i=0;i<5;i++)
System.out.println(i+". read "+list.get(0)[i][i]);//using dynamic index
答案 3 :(得分:-1)
你应该阅读java的基础知识。 首先,您在循环中使用相同的数组索引而不是迭代。这就是我认为你写它的意思。
List<Color[][]> list = new ArrayList<Color[][]>();
for(int i=0;i<5;i++){
if(i==0) tab[i][i] = Color.white;
if(i==1) tab[i][i] = Color.blue;
if(i==2) tab[i][i] = Color.black;
if(i==3) tab[i][i] = Color.red;
if(i==4) tab[i][i] = Color.cyan;
System.out.println(i+" add "+tab[i][i]);
list.add(tab);
}
System.out.println("_");
for(int i=0;i<5;i++)
System.out.println(i+". read "+list.get(i)[i][i]);
此代码中也不需要使用多维数组,也不需要使用它的列表。