您的位置:

Java中List的深拷贝实现

一、什么是深拷贝

深拷贝是指在拷贝对象时,对于对象中引用类型的成员变量,需要拷贝其所引用的对象,而不是只拷贝其引用地址。

对于List等集合类型,其内部可能包含多个对象,这就需要对List进行深复制,确保复制出来的List中的对象与原List中对象没有任何关联。

二、浅拷贝与深拷贝的区别

浅拷贝是指将一个对象的引用复制给另一个对象,新对象与原对象会共享同一个对象。

深拷贝是指将一个对象完全复制一份,并开辟一个新的内存空间存储新对象,两个对象不共享内存空间。

三、常用的List深拷贝实现方法

1.使用BeanUtils

public static  List
    deepCopy(List
     src) {
    List
      dest = new ArrayList<>();
    for (T t : src) {
        T temp = BeanUtils.copyProperties(t);
        dest.add(temp);
    }
    return dest;
}

     
    
   
  

BeanUtils是Apache Commons BeanUtils的一个工具类,其提供了对JavaBean的各种操作。在上述代码中,我们使用BeanUtils.copyProperties()方法将List中的每个元素复制到新的List中,从而实现了List的深度复制。

2.使用JSON转换

public static  List
    deepCopy(List
     src) {
    List
      dest = new ArrayList<>();
    String json = JSON.toJSONString(src);
    dest = JSON.parseObject(json, new TypeReference
      
       
        >(){}); return dest; }
       
      
     
    
   
  

这种方式主要是使用了阿里巴巴的FastJson库,将List转换为JSON字符串,再将其转换为目标类型的List。

3.使用序列化

public static  List
    deepCopy(List
     src) {
    List
      dest = null;
    ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
    ObjectOutputStream out = null;
    try {
        out = new ObjectOutputStream(byteOut);
        out.writeObject(src);
        ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
        ObjectInputStream in = new ObjectInputStream(byteIn);
        dest = (List
      ) in.readObject();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    return dest;
}

      
     
    
   
  

这种方式是通过将List进行序列化,然后反序列化生成新的List来实现深拷贝。但是这种方式会生成大量的字节码,不适合大量数据的拷贝。

四、总结

在Java中,深拷贝是非常有用的,避免因为对象引用的重用而造成数据错误。本文介绍了Java中List深拷贝的三种实现方式,开发者可以根据自己的需求选择合适的方式进行实现。