2D阵列列表返回最后一个数组

时间:2014-12-17 10:39:48

标签: java list multidimensional-array

我有问题。

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]

为什么列表只返回最后一个数组?

4 个答案:

答案 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]);

此代码中也不需要使用多维数组,也不需要使用它的列表。