网站意见反馈源码,主页模板,怎么去营销自己的产品,柳州网站建设哪家公司好在 Java 中#xff0c;深拷贝和浅拷贝是对象拷贝#xff08;复制#xff09;时的两个重要概念#xff0c;它们决定了拷贝后的对象与原对象之间的关联性。以下是深拷贝和浅拷贝的详解#xff0c;包括定义、实现方式及其区别。 1. 概念解释
1.1 浅拷贝#xff08;Shallow …在 Java 中深拷贝和浅拷贝是对象拷贝复制时的两个重要概念它们决定了拷贝后的对象与原对象之间的关联性。以下是深拷贝和浅拷贝的详解包括定义、实现方式及其区别。 1. 概念解释
1.1 浅拷贝Shallow Copy
浅拷贝是对对象的一种表层复制
基本数据类型的字段会复制其值。引用数据类型的字段会复制其引用地址即引用同一个对象。
拷贝后的对象与原对象共享引用类型的成员。
特性
拷贝对象与原对象的引用类型字段指向同一个内存地址。修改引用类型的内容会影响到原对象。 1.2 深拷贝Deep Copy
深拷贝是对对象的一种完全复制
基本数据类型的字段会复制其值。引用数据类型的字段会递归拷贝新对象即创建新的内存空间拷贝后不共享引用。
拷贝后的对象与原对象完全独立。
特性
拷贝对象与原对象互不影响任何修改只会影响对应对象。 2. 示例代码
2.1 浅拷贝示例
使用 Object.clone() 方法实现浅拷贝
class Person implements Cloneable {String name;Address address;Person(String name, Address address) {this.name name;this.address address;}Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone(); // 调用 Object 的 clone 方法}
}class Address {String city;Address(String city) {this.city city;}
}public class ShallowCopyExample {public static void main(String[] args) throws CloneNotSupportedException {Address address new Address(New York);Person person1 new Person(John, address);// 浅拷贝Person person2 (Person) person1.clone();// 修改拷贝对象的引用类型字段person2.address.city Los Angeles;// 原对象的引用类型字段也被修改System.out.println(person1.address.city); // 输出Los Angeles}
}2.2 深拷贝示例
手动实现深拷贝
class Person implements Cloneable {String name;Address address;Person(String name, Address address) {this.name name;this.address address;}Overrideprotected Object clone() throws CloneNotSupportedException {// 创建一个浅拷贝Person clonedPerson (Person) super.clone();// 手动深拷贝引用类型字段clonedPerson.address new Address(this.address.city);return clonedPerson;}
}class Address {String city;Address(String city) {this.city city;}
}public class DeepCopyExample {public static void main(String[] args) throws CloneNotSupportedException {Address address new Address(New York);Person person1 new Person(John, address);// 深拷贝Person person2 (Person) person1.clone();// 修改拷贝对象的引用类型字段person2.address.city Los Angeles;// 原对象的引用类型字段未被修改System.out.println(person1.address.city); // 输出New York}
}3. 区别对比
特性浅拷贝深拷贝拷贝方式仅复制对象的基本类型字段和引用类型字段的引用地址。复制对象的所有字段包括引用类型字段所指向的对象。内存分配原对象和拷贝对象共享引用类型字段的内存地址。原对象和拷贝对象完全独立占用不同的内存空间。修改影响修改拷贝对象的引用类型字段会影响原对象。修改拷贝对象不会影响原对象。实现复杂度简单可以直接使用 Object.clone() 方法。较复杂需要手动实现递归拷贝。适用场景引用类型字段无需独立或对性能要求高的场景。引用类型字段需要独立且完全隔离的场景。 4. 实现深拷贝的常用方式
4.1 使用 clone() 方法
递归实现拷贝每个引用类型字段。需要确保所有类都实现 Cloneable 接口并重写 clone() 方法。
4.2 使用序列化
通过将对象序列化为字节流再反序列化来实现深拷贝
import java.io.*;class Person implements Serializable {String name;Address address;Person(String name, Address address) {this.name name;this.address address;}
}class Address implements Serializable {String city;Address(String city) {this.city city;}
}public class DeepCopyWithSerialization {public static void main(String[] args) throws IOException, ClassNotFoundException {Address address new Address(New York);Person person1 new Person(John, address);// 深拷贝Person person2 deepCopy(person1);// 修改拷贝对象的引用类型字段person2.address.city Los Angeles;// 原对象的引用类型字段未被修改System.out.println(person1.address.city); // 输出New York}// 序列化深拷贝方法private static T T deepCopy(T object) throws IOException, ClassNotFoundException {ByteArrayOutputStream byteOut new ByteArrayOutputStream();ObjectOutputStream out new ObjectOutputStream(byteOut);out.writeObject(object);ByteArrayInputStream byteIn new ByteArrayInputStream(byteOut.toByteArray());ObjectInputStream in new ObjectInputStream(byteIn);return (T) in.readObject();}
}4.3 使用第三方库
一些第三方库如 Apache Commons Lang 的 SerializationUtils可以简化深拷贝的实现。 5. 注意事项 Cloneable 接口的限制 默认的 Object.clone() 方法只能实现浅拷贝需要手动实现深拷贝。 性能考虑 深拷贝通常比浅拷贝耗时更多尤其是引用类型字段复杂时。 引用循环问题 如果对象内部存在循环引用即对象引用自身或其他对象需要特别处理避免递归拷贝时发生栈溢出。 使用场景选择 如果引用类型字段无需独立修改浅拷贝通常已足够。如果引用类型字段需要独立且修改后不影响原对象使用深拷贝。 6. 总结
浅拷贝深拷贝仅复制值类型字段和引用地址复制值类型字段并递归复制引用类型字段所指向的对象性能较高但存在引用共享的问题性能较低但保证拷贝对象独立适用于引用类型字段无需独立修改的场景适用于引用类型字段需要独立且完全隔离的场景
在实际应用中应根据具体需求选择合适的拷贝方式。浅拷贝适用于简单的场景而深拷贝更适合复杂对象需要完全隔离的场景。