设计高端网站哪家好县总工会网站建设情况
2026/5/21 10:23:19 网站建设 项目流程
设计高端网站哪家好,县总工会网站建设情况,3d自学网站,广州网站开发招聘深拷贝#xff08;Deep Copy#xff09;和浅拷贝#xff08;Shallow Copy#xff09;是编程中复制对象时的两种不同方式#xff0c;核心区别在于 是否递归复制对象内部的引用类型成员。一、浅拷贝#xff08;Shallow Copy#xff09;✅ 定义#xff1a;创建一个新对象。…深拷贝Deep Copy和浅拷贝Shallow Copy是编程中复制对象时的两种不同方式核心区别在于是否递归复制对象内部的引用类型成员。一、浅拷贝Shallow Copy✅ 定义创建一个新对象。基本数据类型如int、String、boolean的值会被直接复制值拷贝。引用类型如对象、数组、List只复制引用地址不复制实际对象。 内存效果原对象 A ────┬──→ 基本字段10独立 └──→ 引用字段Addr123指向堆中地址对象 浅拷贝 B ───┬──→ 基本字段10独立副本 └──→ 引用字段Addr123和 A 共享同一个地址对象⚠️ 特点修改基本类型字段互不影响。修改引用类型字段的内容如address.city 上海会影响原对象 示例Javaclass Address { String city; } class Person { String name; Address address; } // 浅拷贝使用 clone() 默认行为 Person p1 new Person(); p1.name 张三; p1.address new Address(); p1.address.city 北京; Person p2 (Person) p1.clone(); // 浅拷贝 p2.address.city 上海; // 修改引用对象 System.out.println(p1.address.city); // 输出 上海 → 被影响了二、深拷贝Deep Copy✅ 定义创建一个全新的对象。递归复制所有层级不仅复制对象本身还复制它引用的所有对象子对象、孙子对象……。新旧对象完全独立没有任何共享引用。 内存效果原对象 A ───→ Addr123city北京 深拷贝 B ───→ Addr456city北京← 全新对象✅ 特点修改任何字段包括嵌套对象都不会影响原对象。 示例Java 手动实现class Address implements Cloneable { String city; public Address deepCopy() { Address a new Address(); a.city this.city; return a; } } class Person { String name; Address address; public Person deepCopy() { Person p new Person(); p.name this.name; p.address this.address.deepCopy(); // 关键也拷贝子对象 return p; } } Person p1 new Person(); p1.address new Address(); p1.address.city 北京; Person p2 p1.deepCopy(); p2.address.city 上海; System.out.println(p1.address.city); // 输出 北京 → 不受影响三、对比总结特性浅拷贝深拷贝基本类型字段复制值独立复制值独立引用类型字段复制引用共享对象复制对象全新实例内存占用少多性能快慢需递归修改影响可能互相影响完全独立实现难度简单如clone()复杂需递归或序列化四、常见语言中的实现方式JavaScript浅拷贝{...obj},Object.assign(),arr.slice()深拷贝JSON.parse(JSON.stringify(obj))有局限structuredClone(obj)现代浏览器_.cloneDeep()Lodash 库Python浅拷贝copy.copy(obj)深拷贝copy.deepcopy(obj)Java浅拷贝Object.clone()默认深拷贝重写clone()并递归克隆引用字段序列化/反序列化要求实现Serializable五、一句话记住浅拷贝只复制“外壳”内部对象共享。深拷贝复制“整个家族”完全独立。当你需要完全隔离的数据副本如导出、快照、撤销操作用深拷贝如果只是临时读取或性能敏感且不会修改嵌套对象可用浅拷贝。BeanUtils.copyProperties()不是深拷贝而是典型的浅拷贝Shallow Copy。✅ 官方结论无论是Spring Framework 的org.springframework.beans.BeanUtils.copyProperties还是Apache Commons BeanUtils 的org.apache.commons.beanutils.BeanUtils.copyProperties它们都只执行浅拷贝。 什么是“浅拷贝”在此处的含义对于基本数据类型如int,String,Boolean值会被复制到目标对象 → 修改互不影响 ✅对于引用类型如Address,List, 自定义对象只复制引用地址不创建新对象 → 源对象和目标对象共享同一个子对象实例❌这意味着如果你修改了目标对象中某个嵌套对象的属性源对象也会被影响 示例说明使用 Spring BeanUtils// 定义类 class Address { private String city; // getter/setter } class Person { private String name; private Address address; // getter/setter }// 使用 copyProperties Person source new Person(); source.setName(张三); source.setAddress(new Address()); source.getAddress().setCity(北京); Person target new Person(); BeanUtils.copyProperties(source, target); // 浅拷贝 // 修改 target 的嵌套对象 target.getAddress().setCity(上海); // 结果 System.out.println(source.getAddress().getCity()); // 输出 上海 System.out.println(target.getAddress().getCity()); // 输出 上海 两个对象的address字段指向同一个Address实例因此修改一个会影响另一个。⚠️ 为什么不是深拷贝BeanUtils.copyProperties的工作原理是通过反射获取源对象的getter 方法调用目标对象的setter 方法直接赋值返回的对象引用它不会递归地为每个引用类型字段创建新实例因此无法实现深拷贝 。✅ 如何实现真正的深拷贝如果你需要深拷贝可以考虑以下方案方法说明缺点手动逐层复制在 setter 中 new 子对象并复制属性代码冗长维护成本高序列化/反序列化使用ObjectOutputStream或 FastJSON/Jackson要求所有类实现Serializable性能较差第三方库如 Dozer、ModelMapper、MapStruct需引入依赖学习成本JSON 中转慎用JSON.parseObject(JSON.toJSONString(obj), Clazz)可能丢失类型信息如 Date 变时间戳且有性能开销示例Jackson 深拷贝ObjectMapper mapper new ObjectMapper(); String json mapper.writeValueAsString(source); Target target mapper.readValue(json, Target.class); // 真正的深拷贝 总结问题回答BeanUtils.copyProperties是深拷贝吗❌不是是浅拷贝能否用于含嵌套对象的 DTO 转换⚠️可以但要确保后续不修改嵌套对象否则会污染源数据修改目标对象会影响源对象吗✅如果修改的是引用类型的内部状态会推荐在什么场景使用✅ 仅包含基本类型或不可变对象如String的 POJO 复制最佳实践当你的 DTO/Entity没有嵌套对象或嵌套对象不会被修改时BeanUtils.copyProperties是安全高效的一旦涉及可变的复杂对象图请改用深拷贝方案 。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询