java中的拷貝操作分為淺拷貝和深拷貝,兩種拷貝方式的實現方式和結果不太一樣。
淺拷貝
淺拷貝指的是將一個對象復制到另一個對象,新對象與原對象共享同一塊內存區域的數據。也就是說,新的對象只是原對象的一個副本,是對原對象的一個字段值的引用。因此,如果新對象發生了改變,原對象也會受到影響。
public class TestShallowCopy { public static void main(String[] args) { Person person1 = new Person("Tom", 20); Person person2 = person1; // 改變person2的年齡 person2.setAge(25); System.out.println(person1); // Tom, 25 System.out.println(person2); // Tom, 25 } } class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return name + ", " + age; } }
深拷貝
深拷貝指的是將一個對象復制到另一個對象,新對象與原對象各自占有一塊內存區域,兩個對象之間沒有任何關系。因此,如果新對象發生了改變,原對象不會受到影響。
public class TestDeepCopy { public static void main(String[] args) throws IOException, ClassNotFoundException { Person person1 = new Person("Tom", 20); ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(person1); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); Person person2 = (Person) ois.readObject(); // 改變person2的年齡 person2.setAge(25); System.out.println(person1); // Tom, 20 System.out.println(person2); // Tom, 25 } } class Person implements Serializable { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return name + ", " + age; } }
一般情況下,淺拷貝的效率比深拷貝高很多。但是,在需要復制整個對象樹時,深拷貝是必須的。