本文共 2568 字,大约阅读时间需要 8 分钟。
浅拷贝
list A浅拷贝给list B,由于进行的是浅拷贝,所以直接将A的内容复制给了B,java中相同内容的数组指向同一地址,即进行浅拷贝后A与B指向同一地址。造成的后果就是,改变B的同时也会改变A,因为改变B就是改变B所指向地址的内容,由于A也指向同一地址,所以A与B一起改变。
深拷贝
深拷贝就是将A复制给B的同时,给B创建新的地址,再将地址A的内容传递到地址B。ListA与ListB内容一致,但是由于所指向的地址不同,所以改变相互不受影响。
package com.xiaobu.note.List;import lombok.Data;import java.io.Serializable;/** * @author xiaobu * @version JDK1.8.0_171 * @date on 2020/4/22 15:51 * @description */@Datapublic class Person implements Serializable { private static final long serialVersionUID = 4985979692978416419L; private String name; private Integer age; public Person(){ } public Person(String name,Integer age){ this.name = name; this.age = age; }}
package com.xiaobu.note.List;import java.io.*;import java.util.ArrayList;import java.util.List;/** * @author xiaobu * @version JDK1.8.0_171 * @date on 2018/11/9 17:31 * @description V1.0 */public class Demo6 { public static void main(String[] args) { List list1 = new ArrayList<>(); Person person1 = new Person("1", 1); Person person2 = new Person("2", 2); list1.add(person1); list1.add(person2); List list2 = new ArrayList<>(); List list3; list2.addAll(list1); list3 = deepCopy(list1); System.out.println("修改前=========="); System.out.println("list2 = " + list2); System.out.println("list1 = " + list1); System.out.println("list3 = " + list3); person2.setAge(3); System.out.println("修改后=========="); System.out.println("list2 = " + list2); System.out.println("list1 = " + list1); System.out.println("list3 = " + list3); } /** * 功能描述:深拷贝 * @author xiaobu * @date 2020/4/22 17:17 * @param src list * @return java.util.List* @version 1.0 */ public static List deepCopy(List src) { try { ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteOut); out.writeObject(src); ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray()); ObjectInputStream in = new ObjectInputStream(byteIn); @SuppressWarnings("unchecked") List dest = (List ) in.readObject(); return dest; } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } return null; }}
结果如图:
list3执行的深拷贝所以不受影响,list2执行的浅拷贝,list1和list2内存地址一致,只要有一个里面的对象属性发生变化就会随着改变。参考:
转载地址:http://rwgai.baihongyu.com/