[英]Deep Copy Arraylist Of Objects
对于我正在处理的项目,我想用我的自定义 Dot 对象编辑 arraylist 并将其传递给递归方法,但只有递归调用具有编辑后的 arraylist。 所以我尝试事先编辑它,传递一个副本,然后将其更改回来,但由于它是通过引用传递的,因此它们每个都在更改其他值。 如何制作深层副本,以便我可以传入已编辑的 arraylist,但保持原件完整,并将它们分开? 我正在设置 boolean 值,我希望在使用新方法时保持设置,但实际上在原始 arraylist 中并不存在。
for (Dot d : dots) {
if (d.isFull() && d.left.isFull() && !(d.left.left.isFull())) {
d.setEmpty();
d.left.setEmpty();
d.left.left.setFull();
ArrayList<Dot> newdots = new ArrayList<>(dots);
move(newdots);
d.setFull();
d.left.setFull();
d.left.left.setEmpty();
}
if (d.isFull() && d.right.isFull() && !(d.right.right.isFull())) {
d.setEmpty();
d.right.setEmpty();
d.right.right.setFull();
ArrayList<Dot> newdots = new ArrayList<>(dots);
move(newdots);
d.setFull();
d.right.setFull();
d.right.right.setEmpty();
}
如果你想在 Java 中深度克隆 object 你有两种方法:
使用clone
方法,但您必须记住,此方法会创建一个浅克隆。 如果您的 object 包含对其他对象的引用,则只会克隆主 object。 如果您还想克隆孩子,那么您必须覆盖他们的克隆方法,并且在主 object 的克隆方法中您必须调用它们。 这应该对所有内部对象递归地完成。
如果您的主要 object 和它的所有孩子都是Serializable
,那么您可以使用以下方法:
<T extends Serializable> T deepClone(T t) throws IOException, ClassNotFoundException { return deserialize(serialize(t)); } private <T extends Serializable> byte[] serialize(T t) throws IOException { try (ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos)) { oos.writeObject(t); return baos.toByteArray(); } } private <T extends Serializable> T deserialize(byte[] data) throws IOException, ClassNotFoundException { try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data))) { return (T) ois.readObject(); } }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.