繁体   English   中英

对象的深拷贝 Arraylist

[英]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 你有两种方法:

  1. 使用clone方法,但您必须记住,此方法会创建一个浅克隆。 如果您的 object 包含对其他对象的引用,则只会克隆主 object。 如果您还想克隆孩子,那么您必须覆盖他们的克隆方法,并且在主 object 的克隆方法中您必须调用它们。 这应该对所有内部对象递归地完成。

  2. 如果您的主要 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM