深拷贝与浅拷贝的关键区别在于是否复制对象内部的引用对象。1. 浅拷贝仅复制对象的非引用类型字段,引用类型字段则共享同一地址,修改一个对象的引用字段会影响其他对象;2. 深拷贝递归复制所有引用对象,生成完全独立的新对象,修改新对象不影响原对象。3. 实现深拷贝的方式包括手动递归复制、重写 clone() 方法、序列化与反序列化、使用第三方库等。4. 选择拷贝方式需根据场景决定:浅拷贝适用于引用对象不可变或需要共享的情况,深拷贝适用于需完全独立的场景。5. 实现深拷贝时需注意循环引用问题,可通过缓存已复制对象避免无限递归。6. 深拷贝性能开销较大,在高性能场景中应谨慎使用或采用优化策略。

深拷贝和浅拷贝,关键在于拷贝对象时,是否复制了对象内部的引用对象。浅拷贝只复制引用,深拷贝则会递归地复制所有引用对象,生成全新的独立对象。

深拷贝和浅拷贝的区别,本质上是对对象内部引用类型的处理方式不同。

浅拷贝的陷阱:共享的引用
浅拷贝,也叫影子拷贝,创建新对象时,只复制原始对象的非引用类型字段的值。对于引用类型字段,新对象只是复制了引用地址,这意味着新对象和原始对象共享同一个引用对象。修改其中一个对象的引用对象,另一个对象也会受到影响。例如:
立即学习“Java免费学习笔记(深入)”;

class Address { String city; public Address(String city) { this.city = city; } public String getCity() { return city; } public void setCity(String city) { this.city = city; }}class Person { String name; Address address; public Person(String name, Address address) { this.name = name; this.address = address; } public String getName() { return name; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } // 浅拷贝方法 public Person shallowCopy() { return new Person(this.name, this.address); }}public class Main { public static void main(String[] args) { Address address = new Address("Beijing"); Person person1 = new Person("Alice", address); Person person2 = person1.shallowCopy(); // 修改 person2 的地址 person2.getAddress().setCity("Shanghai"); System.out.println("Person1's city: " + person1.getAddress().getCity()); // 输出 Shanghai System.out.println("Person2's city: " + person2.getAddress().getCity()); // 输出 Shanghai }}登录后复制
文章来自互联网,不代表电脑知识网立场。发布者:,转载请注明出处:https://www.pcxun.com/n/733710.html
