Java:浅拷贝和深拷贝实现方式

什么情况下需要拷贝对象

需要A对象的属性值,且拷贝完的B对象属性发生修改时,不影响到A对象

拷贝方式错误的方式

对象拷贝

        CcBillLading ccBillLading = new CcBillLading();
        ccBillLading.setBlCode("test111");

        CcBillLading ccBillLading2 = ccBillLading;

        System.out.println(ccBillLading == ccBillLading2);//true

如果直接赋值,拷贝对象实际还是指向被拷贝对象的内存地址

集合拷贝

        List<CcBillLading> list = new ArrayList<>();
        CcBillLading lading = new CcBillLading();
        lading.setBlCode("111");
        CcBillLading lading2 = new CcBillLading();
        lading2.setBlCode("222");
        list.add(lading);
        list.add(lading2);

        List<CcBillLading> list2 = list;

        System.out.println(list == list2);//true

如果直接赋值,拷贝集合实际指向被拷贝集合的内存地址

浅拷贝和深拷贝的区别

如果想拷贝的新对象是独立,不影响到源对象,则可进行浅拷贝或者深拷贝。下面是两者区别:
浅克隆:当对象被复制时只复制它本身和它包含的值类型(基本数据,包装类型,String类型)的成员变量,而引用对象的成员变量并没有复制(即引用的还是原来子对象内存地址)

深克隆:除了对象本身被复制外,对象所包含的所有成员变量也将复制

浅拷贝实现方式

对象拷贝

BeanUtils.copyProperties(源对象,拷贝对象); //记住使用spring提供的

集合拷贝

ListUtil.toList(源集合); //hutool工具包下的
PS:此方式只是两者的List内存地址不一样。

如果是值类型的泛型,则拷贝集合的元素相当副本,和源集合元素无关
如果是引用类型的泛型,则拷贝集合的元素还保存是源集合元素的内存地址

深拷贝实现方式

对象或集合实现深拷贝有个小技巧,就是先转为json,json再转回去,即可拿到一个新对象。

对象拷贝

CcBillLading lading2 = JSONUtil.toBean(JSONUtil.toJsonStr(lading), CcBillLading.class);

集合拷贝

List<CcBillLading> list2 = JSONUtil.toList(JSONUtil.parseArray(list), CcBillLading.class);
posted @ 2022-11-22 14:36  爱编程DE文兄  阅读(353)  评论(1编辑  收藏  举报