浅拷贝只复制对象本身及基本类型值,引用类型仅复制地址;深拷贝则递归复制整个对象图,确保完全独立。关键看是否允许共享状态:读取或全局配置用浅拷贝,并发修改、缓存备份等须用深拷贝。
浅拷贝只复制对象本身,不复制它引用的其他对象;深拷贝则会递归复制整个对象图,包括所有被引用的对象。
浅拷贝创建一个新对象,将原对象的字段值逐个复制过去。对于基本类型(如int、boolean),值被真正复制;对于引用类型(如String、ArrayList、自定义对象),只是把引用地址复制过去——新旧对象指向同一个堆内存中的实例。
常见实现方式:
示例:一个Person包含name(String)和address(Address对象)。浅拷贝后,两个Person的address字段指向同一个Address实例,修改其中一个的address.city,另一个也会变。
拷贝:彻底隔离对象关系深拷贝确保新对象与原对象完全独立,包括其所有嵌套引用对象也都新建副本。修改拷贝后的任意层级数据,都不会影响原始对象。
常用实现方式:
注意:String虽是引用类型,但因不可变性,在浅拷贝中通常无需额外处理;而ArrayList、HashMap等可变容器必须单独深拷贝其内部元素。
关键看业务是否允许“共享状态”:
一个简单经验:只要对象里有可变的引用类型字段(尤其是集合、日期、自定义实体),且后续可能被修改,就该考虑深拷贝。
容易忽略的细节:
不复杂但容易忽略:深拷贝不是银弹,性能开销明显,应结合场景权衡。必要时可通过不可变设计(Immutable Pattern)从源头规避拷贝需求。