`
xinklabi
  • 浏览: 1591006 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
文章分类
社区版块
存档分类
最新评论

List深度复制

    博客分类:
  • Java
 
阅读更多

昨天弄了一个类似List<Map<String, List<String>>>这样的list的复制,结果无论使用new ArrayList<>(srcList),还是Collections.copy(dest, src),貌似都是浅复制,改变新的List就会影响原来的,今天发现下面的方法很简单,记录下来

 

 

 

  1. import java.io.ByteArrayInputStream;  
  2. import java.io.ByteArrayOutputStream;  
  3. import java.io.IOException;  
  4. import java.io.ObjectInputStream;  
  5. import java.io.ObjectOutputStream;  
  6. import java.io.Serializable;  
  7. import java.util.LinkedList;  
  8. import java.util.List;  
  9.   
  10. class Cat implements Serializable {  
  11.     private String cat;  
  12.     public Cat(String name) {  
  13.         cat = name;  
  14.     }  
  15.     public String getCat() {  
  16.         return cat;  
  17.     }  
  18.     public void setCat(String cat) {  
  19.         this.cat = cat;  
  20.     }  
  21. }  
  22.   
  23. public class CopyList {  
  24.     public static void main(String[] args) throws IOException,  
  25.             ClassNotFoundException {  
  26.         LinkedList<Cat> list = new LinkedList<Cat>();  
  27.         list.add(new Cat("a"));  
  28.         list.add(new Cat("b"));  
  29.         // 用原有集合创建新集合  
  30.         List<Cat> listCopy = (List<Cat>) deepcopy(list);  
  31.         // Collections.copy(listCopy, list);  
  32.         listCopy.add(new Cat("c"));  
  33.         for (Cat s : listCopy) {  
  34.             System.out.println("listCopy:" + s + "--cat:" + s.getCat());  
  35.         }  
  36.         for (Cat s : list) {  
  37.             System.out.println("list:" + s + "--cat:" + s.getCat());  
  38.         }  
  39.         System.out.println("listCopy:" + listCopy);  
  40.         System.out.println("list:" + list);  
  41.     }  
  42.   
  43.     public static List deepcopy(List src) throws IOException,  
  44.             ClassNotFoundException {  
  45.         ByteArrayOutputStream byteout = new ByteArrayOutputStream();  
  46.         ObjectOutputStream out = new ObjectOutputStream(byteout);  
  47.         out.writeObject(src);  
  48.         ByteArrayInputStream bytein = new ByteArrayInputStream(byteout  
  49.                 .toByteArray());  
  50.         ObjectInputStream in = new ObjectInputStream(bytein);  
  51.         List dest = (List) in.readObject();  
  52.         return dest;  
  53.   
  54.     }  
  55. }  
分享到:
评论

相关推荐

    java List 深度复制方法

    这篇博客将探讨如何在Java中对List进行深度复制。 首先,我们来理解一下什么是浅复制和深复制。在Java中,当我们使用`clone()`方法或`System.arraycopy()`进行复制时,通常得到的是浅复制的结果。这意味着原始对象...

    List Clone.zip_c list深度复制_list clone_list的深度复制 C#

    List的深度复制 浅谈C#中List&lt;T&gt;对象的深度拷贝问题

    浅谈C#中ListT对象的深度拷贝问题

    一、List对象中的T是值类型的情况(int 类型等)...1、对于引用类型的List无法用以上方法进行复制,只会复制List中对象的引用,可以用以下扩展方法复制: static class Extensions { public static IList&lt;T&gt; Clone(t

    浅谈C#中List&lt;T&gt;对象的深度拷贝问题

    因此,直接使用构造函数`new List(oldList)`即可实现浅拷贝,也就是值类型的深度拷贝,因为值类型在赋值或复制时会自动执行值拷贝。 然而,如果List中的T是引用类型,比如自定义的实体类,情况就有所不同。这时,...

    android 浅复制和深复制-Java Generic Deep Copy 篇

    在Android开发中,数据对象的复制是一个常见的需求,特别是在处理数据持久化、界面状态恢复或者组件间通信时。本文将深入探讨Java中的浅复制和深复制,并以Android为背景,结合具体的实例讲解如何实现Java泛型深拷贝...

    深入浅析Python中list的复制及深拷贝与浅拷贝

    即深拷贝只对标准的可变数据类型如list、dict等进行递归复制。对于包含自定义对象的列表,深拷贝只复制对象的引用,而不是对象本身。 在实际编程中,使用深拷贝和浅拷贝时,应当留意可能出现的内存开销和性能问题。...

    javaMyStack源代码

    因为SUN的Stack不是严格意义上的stack,因此需要重写下,是这样的

    C#复制和深度复制的实现方法

    然而,如果列表中包含的是引用类型,如`List&lt;Car&gt;`,那么就需要根据具体需求选择适当的复制策略,可能是浅表复制或者深度复制。 总之,C#中的对象复制是编程中不可或缺的一部分,理解浅表复制和深度复制的概念以及...

    用序列化实现ListT 实例的深复制(推荐)

    当我们处理包含引用类型的集合,如List时,如果直接通过构造函数或Clone方法创建新列表,通常只会得到浅复制的结果。 在标题和描述中提到的问题中,当List中的T是引用类型,如myClass类的实例,直接使用`new List...

    java不同对象及集合的多次复制

    - **Dozer库**:允许使用注解来定义复制规则,支持深度复制和类型转换,可以实现不同对象间的复制。 - **ModelMapper库**:提供了`ModelMapper`类,可以通过配置注解自动映射对象,简化了复制过程。 4. **集合与...

    广义表的创建,深度计算

    广义表(Generalized List)是一种数据结构,它扩展了传统列表的概念,允许...通过不断实践和优化,可以构建更复杂的广义表操作,如复制广义表、查找特定元素、合并广义表等,从而更好地理解和运用这一重要的数据结构。

    C# List引用类型克隆的3种方法

    在C#编程中,有时我们需要创建一个列表(List)的副本,以便在不影响原始列表的情况下进行操作。本文将探讨三种克隆C# List引用类型的方法:反射、JSON序列化(依赖于Newtonsoft.Json库)以及BinaryFormatter序列化。 ...

    WSL2安装深度学习环境

    安装CUDNN时,同样从NVIDIA官网下载对应版本,解压后将包含的库文件复制到CUDA安装目录下的相应位置。 接下来,安装Anaconda,这是一个流行的Python分发版,包含了大量科学计算库和环境管理工具。访问Anaconda官网...

    深度探索c++对象模型(2012版本)

    此外,拷贝构造函数和赋值运算符也至关重要,它们处理对象的复制和赋值,确保数据的正确处理。 在C++中,类是定义对象的蓝图,而对象是类的实例。每个类可以有成员变量和成员函数,其中成员函数(方法)负责对象的...

    真彩色Image List

    在标准的Image List中,图像通常是索引颜色或16位色,这限制了图像的颜色深度和表现力。然而,"真彩色Image List"解决了这个问题,它支持24位或32位真彩色图像,提供了更丰富的色彩和更真实的图像显示。 1. **真...

    U10316013_HW5_15_10:重写 MyStack 类以执行列表字段的深拷贝

    在编程领域,特别是Java语言中,深拷贝和浅...通过这样的实现,当你需要复制一个MyStack实例时,无论是通过拷贝构造函数还是`clone()`方法,都能保证列表字段的深度复制,从而得到一个与原对象独立的、完整的新实例。

    Array和Collection相互转换以及copy深度的小测

    本篇文章将深入探讨如何进行这些转换以及涉及到的复制(copy)深度问题。 首先,`Array`和`Collection`是Java中两种不同的数据结构。`Array`是一种固定大小的数据结构,用于存储同类型元素的序列,而`Collection`是...

    深度学习入门-Python语言学习-08公共操作和推导式-入门学习

    同样,`*`运算符可以用于复制元素,如`str * n`将字符串复制n次,`list * n`或`tuple * n`则将列表或元组重复n次。 `in`和`not in`运算符用于检查元素是否存在于特定的容器(如字符串、列表、元组或字典)中。例如...

    数据复制代码JAVA

    要进行深度拷贝(即完全复制对象的所有属性),需实现`Cloneable`接口并重写`clone()`方法。 2. **Arrays类的深拷贝** Java的`Arrays`类提供了`copyOf()`和`copyOfRange()`方法,用于数组的数据复制。这两个方法...

Global site tag (gtag.js) - Google Analytics