Java List复制:浅拷贝与深拷贝方法及区别

List浅拷贝

将数组A浅拷贝给数组B,就是将A数组得在内存中得地址浅拷贝给数组B,改变B得同时也会改变A,因为俩个数组得在内存中得地址是同一个

几种浅拷贝

1.遍历复制


public static void main(String[] args) {
List<Integer> A = Arrays.asList(1, 2, 3, 4, 5);
        // 遍历循环复制
        ArrayList<Integer> B = new ArrayList<>(A.size());
        A.forEach(integer -> {
            B.add(integer);
        });
        System.out.println(B); // [1, 2, 3, 4, 5]
    }

2.使用List实现类的构造方法


public static void main(String[] args) {
// 使用List的构造方法
        List<Integer> A = Arrays.asList(1, 2, 3, 4, 5);
        List<Integer> B=new ArrayList<Integer>(A);
        System.out.println(B); // [1, 2, 3, 4, 5]
    }

3.使用list.addAll()方法

public static void main(String[] args) {

// 使用List.addAll()

        List<Integer> A = Arrays.asList(1, 2, 3, 4, 5);

        List<Integer> B = new ArrayList<Integer>();

        B.addAll(A);

        System.out.println(B); // [1, 2, 3, 4, 5]

    }

深拷贝就是将A复制给B的同时,给B创建新的地址,再将地址A的内容传递到地址B。ListA与ListB内容一致,但是由于所指向的地址不同,所以改变相互不受影响

深拷贝的方法

1.使用序列化方法 


public static <T> List<T> deepCopy(List<T> src) throws IOException, ClassNotFoundException {
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;  
}  

List<Person> destList=deepCopy(srcList);  //调用该方法

 2.clone方法


public class A implements Cloneable {
  public String name[];   
  
    public A(){   
        name=new String[2];   
    }   
  
    public Object clone() {   
        A o = null;   
        try {   
            o = (A) super.clone();   
        } catch (CloneNotSupportedException e) {   
            e.printStackTrace();   
        }   
        return o;   
    }   
  }  
  for(int i=0;i<n;i+=){
      copy.add((A)src.get(i).clone());
  }

Java 中,深拷贝浅拷贝是指创建新对象并复制原有对象数据结构的过程,通常用于复杂的数据结构如数组、集合、对象等。它们的区别在于是否完全复制了对象的所有内容,包括嵌套的对象。 **浅拷贝**(Shallow Copy):它只是将原对象的引用复制给新对象。这意味着如果新对象中包含对原对象的引用,那么修改新对象会影响到原对象。在 Java 中,对于基本类型,浅拷贝就是简单地赋值;对于引用类型(如对象),则是复制指向内存地址的引用。 例如: ```java Object obj = new Object(); Object copy = obj; // 浅拷贝,copy 和 obj 引向同一块内存 List list = new ArrayList(); // 对象 List copyList = list; // 浅拷贝list 和 copyList 都引用同一个ArrayList实例 ``` 修改 `copyList` 的元素会改变 `list`: ```java copyList.add("test"); System.out.println(list); // 输出 "test" ``` **深拷贝**(Deep Copy):则会对整个对象及其所有嵌套对象进行完整的副本操作,包括递归复制嵌套对象。这样改动一个深拷贝不会影响原始对象。在 Java 中,可以手动实现深拷贝,或者使用序列化反序列化的机制,比如 `Cloneable` 接口和 `Object.clone()` 方法(虽然不是所有类都实现了 Cloneable)。 例如: ```java Object obj = new Object(); Object deepCopy = SerializationUtils.deepCopy(obj); // 使用工具类的深拷贝方法 ``` 在这个例子中,`deepCopy` 是一个新的对象,它的状态与 `obj` 完全独立。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值