如何通过值复制List <List <Integer >>类型的对象的副本(深层复制)?

时间:2019-11-04 17:11:52

标签: java object arraylist

我尝试了多种方法来复制对象而不引用它,在我看来,所有这些方法都是浅复制而不是深复制。

假设我使用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,但出现错误,说明大小不适合来源。

我希望得到一个新对象,而该对象不会受到对旧对象的操作的影响。

1 个答案:

答案 0 :(得分:1)

Integer对象是不可变的,因此您无需深层复制它们。

外部和内部列表都是可变的,因此需要复制它们。假设我们不需要保留列表 type ,例如ArrayListLinkedList相比,我们可以简单地使用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;
}