【发布时间】:2014-08-29 16:50:00
【问题描述】:
我有一个二维数组和堆栈:
int[][] data = new int[][];
Stack<int[][]> undoList = new Stack<int[][]>(10);
我想在每次更改后添加数据以将其保留在撤消列表中:
undoList.push(data);
// some changes to data array
undoList.push(data);
// some changes to data array
undoList.push(data);
那为什么所有栈元素的值都一样呢?
【问题讨论】:
-
看起来您正在使用存储在
data中的相同引用。创建一个新的int[][],然后将其推送到您的Stack。 -
这肯定是一个副本的副本...但我没有设法找到这个链的开始。
-
@Marco13 data.clone() 在这里工作吗?
-
单个
Arrays.copyOf或data.clone()不就足够了。您必须在 进行“一些更改”之前制作数组的深层副本。有关 2D 数组的深拷贝示例,请参见 stackoverflow.com/a/5563301/3182664 等 -
我不确定效率应该在什么时候发挥作用。您必须创建数组的深层副本。这可以像在链接的答案中那样完成(无论行是否具有不同的长度 - 对于等长的行,您将以相同的方式进行操作)。或者,可以使用
target[i] = input[i].clone();,而不是对每一行使用Arrays.copyOf,但这也必须对每一行进行,因此没有显着差异。
标签: java stack stack-trace