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