在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,都需要注意对象内部数据的嵌套和引用情况,确保复制出的对象不会因为内部数据的变化而受到影响。