We often use the method of clone this object class in the development, but the copy that the Super.clone () method returns is a shallow copy, (so-called shallow copy and deep copy is relative, the inner object in the shallow copy is shared with the original object's internal object, is the same , and the internal objects in the deep copy are different. In some cases, we need to get a deep copy of the object, as in the following case
Package Day0815;import Java.io.file;import Java.util.stack;import org.junit.test;public class BaseTree{@Testpublic void Testdelete () {Tree first = new Tree (6,null,null); first = First.put (first, 2); First.put (first, 8); First.put (first, 1) ; First.put (first, 4); First.put (first, 3),//1 2 3 4 6 8system.out.println (first); SYSTEM.OUT.PRINTLN (first);//}}class Tree implements cloneable{//need to implement <span style= "Font-family:arial, Helvetica, Sans-serif; " >cloneable interface </span>private Object date;private tree left;private Tree right;public tree () {super ();} Public Tree (Object date, tree-left, tree-right) {super (); this.date = Date;this.left = Left;this.right = right;} @Overridepublic String toString () {StringBuffer buffer = new StringBuffer (); Tree tree = null;try {tree = (tree) this.clone ();} catch (Clonenotsupportedexception e) {//TODO auto-generated catch bloc Ke.printstacktrace ();} stack<tree> stack = new stack<tree> (), while (Tree!=null&&stack.size () >=0) {if (tree.getleft () = =null) {buffer.append (tree.date.toString () + ""), if (Tree.getright ()!=null) {tree = Tree.getright ();} Else{if (Stack.size () ==0) {break;} Tree = Stack.pop ();}} Else{stack.push (tree); Tree T = tree.getleft (); Tree.setleft (null); tree = t;}} return buffer.tostring ();} Public tree put (tree tree,int i) {if (i> (Integer) tree.date) {if (tree.right==null) tree.right = new Tree (i,null,null); Elseput (Tree.getright (), i);} else if (i== (Integer) tree.date) {return tree;} Else{if (tree.left==null) tree.left = new Tree (i,null,null); Elseput (Tree.getleft (), i);} return tree;} Public Object GetDate () {return date;} public void SetDate (Object date) {this.date = date;} Public Tree GetLeft () {return to left;} public void Setleft (Tree left) {this.left = left;} Public Tree GetRight () {return to right;} public void Setright ("Tree right") {this.right = right;}}
Operation Result:
1 2 3 4 6 8
3 4 6 8
Because the Clone method is not overridden, the resulting copy is a shallow copy, and the Left property inside is shared, so the output structure is wrong
Deep copies can be implemented in the following ways
@Overrideprotected Object Clone () throws Clonenotsupportedexception {//TODO auto-generated method Stubtree o = Null;o = ( Tree) Super.clone (); if (O.getleft ()!=null) O.setleft ((Tree) O.getleft (). Clone ()); if (O.getright ()!=null) o.setright ((Tree) O.getright (). Clone ()); return o;}
Operation Result:
1 2 3 4 6 8
1 2 3 4 6 8
You can also get a deep copy by deserializing it, but the speed is slow.
@Overrideprotected Object Clone () throws Clonenotsupportedexception {//TODO auto-generated method stub Bytearrayoutputstream bo = new Bytearrayoutputstream (); ObjectOutputStream oo = null;try {oo = new ObjectOutputStream (bo);} catch (IOException e) {//TODO auto-generated catch bl Ocke.printstacktrace ();} try {oo.writeobject (this);} catch (IOException e) {//TODO auto-generated catch Blocke.printstacktrace ();} Read from the stream bytearrayinputstream bi = new Bytearrayinputstream (Bo.tobytearray ()); ObjectInputStream oi = null;try {oi = new ObjectInputStream (BI);} catch (IOException e) {//TODO auto-generated catch bloc Ke.printstacktrace ();} try {return (Oi.readobject ()),} catch (IOException e) {//TODO auto-generated catch Blocke.printstacktrace ();} catch (Clas Snotfoundexception e) {//TODO auto-generated catch Blocke.printstacktrace ();} return null;}
Copyright NOTICE: This article for Bo Master original article, without Bo Master permission not reproduced.
[Clone] Deep copy and shallow copy instance parsing in Java