list複製 淺拷貝和深拷貝

淺拷貝

list A淺拷貝給list B,由於進行的是淺拷貝,所以直接將A的內容複製給了B,java中相同內容的數組指向同一地址,即進行淺拷貝後A與B指向同一地址。造成的後果就是,改變B的同時也會改變A,因爲改變B就是改變B所指向地址的內容,由於A也指向同一地址,所以A與B一起改變。

1.jpg

深拷貝

深拷貝就是將A複製給B的同時,給B創建新的地址,再將地址A的內容傳遞到地址B。ListA與ListB內容一致,但是由於所指向的地址不同,所以改變相互不受影響。
2.jpg

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
 */
@Data
public 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<T>
     * @version 1.0
     */
    public static <T> List<T> deepCopy(List<T> 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<T> dest = (List<T>) in.readObject();
            return dest;
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

}


結果如圖:
list3執行的深拷貝所以不受影響,list2執行的淺拷貝,list1和list2內存地址一致,只要有一個裏面的對象屬性發生變化就會隨着改變。
1587547219(1).jpg

參考:
java List複製:淺拷貝與深拷貝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章