## 浅拷贝 / 属性映射 `subtractedArray = Arrays.copyOf(sellPriceArr, sellPriceArr.length);` 浅拷贝的场景有啥? 当我们开启阿里代码扫描®插件时,如果你使用了 Apache BeanUtils。copyProperties 进行属性拷贝,它会给你一个非常严重的警告。因为,Apache BeanUtils 性能较差,可以使用 Spring BeanUtils 或者Cglib BeanCopier 来代替。 po - dto - vo的转换就是浅拷贝,可以用mapstruct、cglib copy | 特性 | Apache BeanUtils | Spring BeanUtils | Cglib BeanCopier | | ---- | ---------------- | ---------------- | ---------------- | | 性能 | 较差 | 较好 | 最佳 | | 实现方式 | 过度使用反射 | 反射 | 动态字节码生成 | | 缓存机制 | 没有用缓存提高性能 | 有 | 有 | | 类型转换 | 支持 | 有限支持 | 不支持 | | 使用难度 | 简单 | 简单 | 相对复杂 | | 灵活性 | 高 | 中 | 低 | | 用哪个?| | ✅平衡了性能和易用性 | | ![](https://cdn-a.markji.com/files/65b9fbcf3667ade34d5fed51_hd.png?e=1727259572446&token=xX63b9jqTlDOcGmctt5K9254rV0LG8hS9BmDeFBy:azuWw3xqAeirSlCYlOHdylzoq8c=) ## 深拷贝 https://www.cnblogs.com/jingzh/p/16700921.html 实现深拷贝有几种方法? 1.递归重写clone方法 需要递归地将整个Object Tree的所有类implements Cloneable, 用深拷贝的方式重写clone()方法 effective java不建议用clone 直接调super.clone(),只能完成浅拷贝。 要想深拷贝需要自己补充实现,但是这样的话递归关系嵌在了object tree上的每个clone方法里,容易受到final等修饰符的影响。自己实现每个地方的 2.先序列化再反序列化 3.享元模式,如果不可变的fields比较多,可以先浅拷贝,再将其中可变的部分深拷贝 写一个拷贝构造器或者写一个拷贝工厂 public MyClass(MyClass other)自己实现方法,对于不可变对象或原始类型,直接浅拷贝即可;对于可变对象或数组,可能需要递归复制每个元素或子对象。