【问题标题】:Making a new ArrayList containing objects the same as the first list?使包含对象的新 ArrayList 与第一个列表相同?
【发布时间】:2016-05-18 15:26:43
【问题描述】:

我有一个包含自定义对象的 ArrayList。

制作具有完全相同内容但不使用相同引用的单独 ArrayList 的最佳方法是什么?例如,如果我编辑 list1 中的第一个对象,它不会触及 list2 中的第一个对象,否则它们看起来完全一样。

执行以下操作是否被认为是正确/良好的做法,还是有内置的方法?

List<MyObject> firstList = getArrayListFromSQLiteDb(criteria);
List<MyObject> secondList = new ArrayList<>();

for (MyObject object : firstList) {
    MyObject newObject = new MyObject();
    newObject.setField1(object.getField1());
    newObject.setField2(object.getField2());
    newObject.setField3(object.getField3());
    secondList.add(newObject);
}

【问题讨论】:

  • 看起来你正在做的很好。不过要小心;如果任何字段是引用,它们将被复制,听起来这不是你想要的。
  • List firstList = getArrayListFromSQLiteDb(criteria);和 List secondList = new ArrayList(firstList);
  • @ManuAG 如果 onky 他们会阅读documentation...
  • @Manu & DjMethaneMan:如果你读了这个问题,你就会明白提问者不只是想要一个列表的副本,他想要一个也复制所有包含对象的深层副本(这样两个列表中都有不同的对象)。 ArrayList 的复制构造函数和 clone() 函数都没有这样做。

标签: java object arraylist copy


【解决方案1】:

执行此操作的一种简单方法是克隆原始 ArrayList,因此不共享引用,并且当您更改原始列表时,其他列表保持不变。正如@911DidBush 提到的,这仅在列表内容可克隆并正确实现 clone() 方法时才有效。

List<MyObject> firstList = getArrayListFromSQLiteDb(criteria);
List<MyObject> secondList = new ArrayList<>();

for(MyObject obj : firstList) {
    secondList.add(obj.clone());
}

【讨论】:

  • 您可能还应该提到,这仅在列表内容可克隆并正确实现 clone() 方法时才有效。否则你会得到一个 CloneNotSupportedException
猜你喜欢
  • 1970-01-01
  • 2021-01-03
  • 2012-11-14
  • 2014-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多