我尝试了多种方法来复制对象而不引用它,在我看来,所有这些方法都是浅复制而不是深复制。
假设我使用main参数向方法发送了java List<List<Integer>>
类型的对象。
void reverseMatrix(List<List<Integer> > grid)
{
}
所以我定义了List> tempGrid = new ArrayList <>();在上面的此方法中,我想复制所有值(按值而不是引用)。
我尝试了Iterator,如下所示:
Iterator<List<Integer>> iterator = grid.iterator();
while(iterator.hasNext()){
tempGrid.add(iterator.next());
}
应用上面的代码后,仍然更改父对象(网格)而不是tempGrid。
如果我应用了此代码java tempGrid.get(0).set(0,1);
它也会改变网格。
我看到了一些有关通过值进行迭代的主题。
List<Integer> temp1 = new ArrayList<>();
for(List<Integer> list: grid){
for(Integer numb: list) {
temp1.add(numb);
}
tempGrid.add(temp1);
}
我尝试使用Collections.copy,但出现错误,说明大小不适合来源。
我希望得到一个新对象,而该对象不会受到对旧对象的操作的影响。
答案 0 :(得分:1)
Integer
对象是不可变的,因此您无需深层复制它们。
外部和内部列表都是可变的,因此需要复制它们。假设我们不需要保留列表 type ,例如ArrayList
与LinkedList
相比,我们可以简单地使用ArrayList(Collection)
构造函数来复制内部列表。
使用不需要Java 8的代码:
static void deepCopy(List<List<Integer>> input) {
List<List<Integer>> output = new ArrayList<>(input.size());
for (List<Integer> inner : input)
output.add(new ArrayList<>(inner));
return output;
}