List中的对象具有相同的值 - 添加的最后一个元素的值

时间:2014-10-14 08:55:05

标签: java arrays arraylist

HY,

我对JAVA有点新意,并且遇到了大问题。当我向List<int[]>添加元素时,结果将是一个具有相同值的List。 为什么JAVA会像这样工作?

以下是代码:

// Global variables
private static int rows = 20;
private static int columns = 30;
private static String[][] labirinth = new String[rows][columns];
private static List<int[]> walls = new ArrayList<int[]>();

// Local variables inside a function
int[] wall = new int[2];
if(row - 1 <= rows && labirinth[row-1][column] == "*")
{
    wall[0] = row-1;
    wall[1] = column;
    walls.add(wall);
}
if(row + 1 <= rows && labirinth[row+1][column] == "*")
{
    wall[0] = row+1;
    wall[1] = column;
    walls.add(wall);
}
if(column - 1 <= columns && labirinth[row][column-1] == "*")
{
    wall[0] = row;
    wall[1] = column-1;
    walls.add(wall);
}
if(column + 1 <= columns && labirinth[row][column+1] == "*")
{
    wall[0] = row;
    wall[1] = column+1;
    walls.add(wall);
}

最后,walls变量将多次保留wall的最后结果。

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

您需要知道数组是一个对象。声明变量时,您声明对该数组的引用。

这意味着,您只需引用相同的数组并多次向同一数组添加walls

您应该为walls

中的每个条目创建一个新数组

答案 1 :(得分:4)

您总是更改同一个对象:

int[] wall = new int[2];

但每次在将新值设置到墙上并将其添加到列表之前,您应该:

wall = new int[2];

如果你不这样做,你每次都会改变相同的墙坐标,最后只有一面墙,它将具有你最后设定的坐标。

// Local variables inside a function
int[] wall = null;
if(row - 1 <= rows && labirinth[row-1][column] == "*")
{
    wall =  new int[2];
    wall[0] = row-1;
    wall[1] = column;
    walls.add(wall);
}
if(row + 1 <= rows && labirinth[row+1][column] == "*")
{
    wall = new int[2];
    wall[0] = row+1;
    wall[1] = column;
    walls.add(wall);
}
...