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());
}
}
结果如下: