数组[]和List深拷贝与浅拷贝的区别,以及实现浅深拷贝的方法

1.数组[]和List深拷贝与浅拷贝的区别,以及实现浅深拷贝的方法
2.数组和(object)和List的传值和传址(拷贝),以及数组嵌套(对象里的数组)数组,list嵌套(对象)list(对象)的传值和传址(拷贝)(详细解说)

深拷贝与浅拷贝的区别

深拷贝和浅拷贝最根本的区别在于是否是真正获取了一个对象的复制实体,而不是引用,
深拷贝在计算机中开辟了一块内存地址用于存放复制的对象,而浅拷贝仅仅是指向被拷贝的内存地址,如果原地址中对象被改变了,那么浅拷贝出来的对象也会相应改变。

简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。

前端JS:
let a=[0,1,2,3,4]; let b =[];
浅拷贝:
b=a;
深拷贝:
b=[...a];

后端JAVA:
List<String> a = new ArrayList<>(); a.add("a"); a.add("b"); a.add("c"); List<String> b;
浅拷贝:
b=a;
深拷贝:
深拷贝不建议用clone,因为如果遇到嵌套类的话,需要重写clone方法才能深拷贝.

在我们的项目当中,经常会遇到一个类里面有List,然后List装载另外一个对象,这个时候要进行深拷贝就需要用到如下的办法,先把Address进行序列化和实现cloneable接口并且重写clone方法。

方法:b = JSONArray.parseArray(JSON.toJSONString(a),String.class);
如果String是一个实体类 Address
方法:b = JSONArray.parseArray(JSON.toJSONString(a), Address.class);

测试代码如下

Address.class

package com.springboot.util.result;

import lombok.Data;

import java.util.List;

@Data
public class Address {

    private String a;
    private String b;
    private String c;

    private List<String> ha;

}

ListTest.class

package com.springboot.util.result;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.util.ArrayList;
import java.util.List;

public class ListTest {


    public static void main(String[] args) {
       ListTest listTest = new ListTest();

       listTest.test1();
       listTest.test();
    }

    public void test1(){
     List<String> a = new ArrayList<>();
     a.add("a");
     a.add("b");
     a.add("c");
     List<String> b;
     b =  JSONArray.parseArray(JSON.toJSONString(a),String.class);
     b.set(0,"5");
     System.out.println(a);
     System.out.println(b);
    }

    public void test(){
     List<Address> list = new ArrayList<>();
     List<String> listChildren = new ArrayList<>();
     Address address = new Address();
     Address address1 = new Address();
     address.setA("a");
     address.setB("b");
     address.setC("c");
     address1.setA("a");
     address1.setB("a");
     address1.setC("a");
     listChildren.add("cat");
     listChildren.add("mouse");
     address.setHa(listChildren);
     list.add(address);
     list.add(address1);
     List<Address> deepAddress;
     deepAddress = JSONArray.parseArray(JSON.toJSONString(list), Address.class);
        deepAddress.get(0).setA("change");
     System.out.println(list.toString());
     System.out.println(deepAddress.toString());
    }
}

结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶孤崖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值