Java 标准API中是否有一种方法可以深度克隆列表?

Java 标准API中是否有一种方法可以深度克隆列表?,java,arraylist,clone,Java,Arraylist,Clone,大约30天后,我将参加一个Java竞赛。在比赛中,我们将得到一台带有Eclipse和Java1.7API的计算机。我正在练习前一年比赛中的任务,我反复发现需要深入克隆一个列表。由于时间有限,而且只有Java1.7API可用,有什么方法可以做到这一点吗 我已经看到了几种解决方案,包括 实现Cloneable接口 导入Java深层克隆库 对列表所包含的任何对象的类实现克隆构造函数,并迭代元素 但这些解决方案要么在比赛中不适用于我,要么太耗时。现在,我需要深度克隆同样包含ArrayLists的对象

大约30天后,我将参加一个Java竞赛。在比赛中,我们将得到一台带有Eclipse和Java1.7API的计算机。我正在练习前一年比赛中的任务,我反复发现需要深入克隆一个列表。由于时间有限,而且只有Java1.7API可用,有什么方法可以做到这一点吗

我已经看到了几种解决方案,包括

  • 实现
    Cloneable
    接口
  • 导入Java深层克隆库
  • 列表
    所包含的任何对象的类实现克隆构造函数,并迭代元素
但这些解决方案要么在比赛中不适用于我,要么太耗时。现在,我需要深度克隆同样包含
ArrayList
s的对象的
ArrayList


有人知道这是否可能吗?谢谢你的帮助

这将完全取决于列表中的内容。因此,简单的答案是:不

您可以尝试序列化整个列表,但这要求列表中的所有内容都可以序列化。您可以编写一个deepClone()方法,对列表中的所有对象调用clone()方法,但这取决于列表中的每个对象是否正确实现clone()方法


这是一个竞赛问题的全部原因是没有一个快速的一刀切的解决方案。

除了调用克隆,您还可以将所有内容写入ByteArrayOutputStream并重新读取

看看这是否有助于您:

  static public <T> T deepCopy(T oldObj) throws Exception {
    ObjectOutputStream oos = null;
    ObjectInputStream ois = null;
    try {
      ByteArrayOutputStream bos = new ByteArrayOutputStream();
      oos = new ObjectOutputStream( bos);
      oos.writeObject( oldObj);
      oos.flush();
      ByteArrayInputStream bin = new ByteArrayInputStream( bos.toByteArray());
      ois = new ObjectInputStream( bin);

      return (T) ois.readObject();
    } catch( Exception e) {
      e.printStackTrace();
      throw ( e);
    } finally {
      if( oos != null) {
        oos.close();
      }
      if( ois != null) {
        ois.close();
      }
    }
  }

将对象序列化为一个流,然后再返回,怎么样?(他们是否实现可序列化)例如:是否也要克隆元素?是的,我正在寻找一种方法来克隆
ArrayList及其所有内容,以及内容的内容。如果必须进行深度克隆,则还必须克隆集合中的元素。当然,为了做到这一点,元素也必须是可克隆的。
public class Testing {

  public static void main(String[] args) throws Exception {

    List<Object> list = new ArrayList<>();
    list.add( "A");
    list.add( "B");
    list.add( 1);
    list.add( 2);
    list.add( new BigDecimal( 123.456839572935879238579238754938741321321321321593857));
    list.add( new MyParentObject( 12345, "abcdef", new MyChildObject( "child")));

    List clone = (List) Tools.deepCopy( list);

    for( Object obj: clone) {
      System.out.println( obj);
    }

    System.exit(0);
  }

  private static class MyParentObject implements Serializable {
    int a;
    String b;
    MyChildObject child;

    public MyParentObject(int a, String b, MyChildObject child) {
      super();
      this.a = a;
      this.b = b;
      this.child = child;
    }

    public String toString() {
      return a + ", " + b + ", " + child;
    }
  }

  private static class MyChildObject implements Serializable {
    String s;

    public MyChildObject( String s) {
      this.s = s;
    }

    public String toString() {
      return s;
    }
  }
}
A
B
1
2
123.456839572935876958581502549350261688232421875
12345, abcdef, child