在Java中,對象的復制是一個非常重要的功能。當需要將一個對象復制到另一個對象,常見的方法是淺copy和深copy。這兩種方式的區別在于復制是否涉及了原始對象內存地址所指向的所有數據。
淺copy只會復制對象的內存地址,而不會創建新的內存空間來儲存對象的數據。因此,如果原始對象內存地址所指向的數據發生變化,淺copy后的新對象也會受到影響。
深copy則會創建新的內存空間來儲存對象的數據。當對原始對象內存地址所指向的數據進行更改時,深copy后的對象不會受到影響。
public class Person { private String name; private int age; private Listhobbies; // Constructor, getters and setters } public static void main(String[] args) { // 創建原始對象 Person originalPerson = new Person("Alice", 25, Arrays.asList("reading", "music")); // 淺copy Person shallowCopyPerson = originalPerson; shallowCopyPerson.getHobbies().add("hiking"); System.out.println(originalPerson.getHobbies()); // [reading, music, hiking] System.out.println(shallowCopyPerson.getHobbies()); // [reading, music, hiking] // 深copy Person deepCopyPerson = new Person(originalPerson.getName(), originalPerson.getAge(), new ArrayList (originalPerson.getHobbies())); deepCopyPerson.getHobbies().add("swimming"); System.out.println(originalPerson.getHobbies()); // [reading, music] System.out.println(deepCopyPerson.getHobbies()); // [reading, music, swimming] }
除了手動創建深copy對象,也可以通過Java的Serialization實現深copy。使用Serialization時,整個對象會被序列化并反序列化到新的對象中,從而創建一個新的對象實例。
public static Object deepCopy(Object object) throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(object); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); return ois.readObject(); } public static void main(String[] args) throws Exception { // 創建原始對象 Person originalPerson = new Person("Alice", 25, Arrays.asList("reading", "music")); // 深copy Person deepCopyPerson = (Person) deepCopy(originalPerson); deepCopyPerson.getHobbies().add("swimming"); System.out.println(originalPerson.getHobbies()); // [reading, music] System.out.println(deepCopyPerson.getHobbies()); // [reading, music, swimming] }
無論是手動創建深copy對象還是使用Serialization,都需要注意對象內部數據的嵌套和引用情況,確保復制出的對象不會因為內部數據的變化而受到影響。
上一篇css中列表加符號