昨天弄了一个类似List<Map<String, List<String>>>这样的list的复制,结果无论使用new ArrayList<>(srcList),还是Collections.copy(dest, src),貌似都是浅复制,改变新的List就会影响原来的,今天发现下面的方法很简单,记录下来
- import java.io.ByteArrayInputStream;
- import java.io.ByteArrayOutputStream;
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.io.Serializable;
- import java.util.LinkedList;
- import java.util.List;
- class Cat implements Serializable {
- private String cat;
- public Cat(String name) {
- cat = name;
- }
- public String getCat() {
- return cat;
- }
- public void setCat(String cat) {
- this.cat = cat;
- }
- }
- public class CopyList {
- public static void main(String[] args) throws IOException,
- ClassNotFoundException {
- LinkedList<Cat> list = new LinkedList<Cat>();
- list.add(new Cat("a"));
- list.add(new Cat("b"));
- // 用原有集合创建新集合
- List<Cat> listCopy = (List<Cat>) deepcopy(list);
- // Collections.copy(listCopy, list);
- listCopy.add(new Cat("c"));
- for (Cat s : listCopy) {
- System.out.println("listCopy:" + s + "--cat:" + s.getCat());
- }
- for (Cat s : list) {
- System.out.println("list:" + s + "--cat:" + s.getCat());
- }
- System.out.println("listCopy:" + listCopy);
- System.out.println("list:" + list);
- }
- public static List deepcopy(List 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);
- List dest = (List) in.readObject();
- return dest;
- }
- }
相关推荐
这篇博客将探讨如何在Java中对List进行深度复制。 首先,我们来理解一下什么是浅复制和深复制。在Java中,当我们使用`clone()`方法或`System.arraycopy()`进行复制时,通常得到的是浅复制的结果。这意味着原始对象...
List的深度复制 浅谈C#中List<T>对象的深度拷贝问题
一、List对象中的T是值类型的情况(int 类型等)...1、对于引用类型的List无法用以上方法进行复制,只会复制List中对象的引用,可以用以下扩展方法复制: static class Extensions { public static IList<T> Clone(t
因此,直接使用构造函数`new List(oldList)`即可实现浅拷贝,也就是值类型的深度拷贝,因为值类型在赋值或复制时会自动执行值拷贝。 然而,如果List中的T是引用类型,比如自定义的实体类,情况就有所不同。这时,...
在Android开发中,数据对象的复制是一个常见的需求,特别是在处理数据持久化、界面状态恢复或者组件间通信时。本文将深入探讨Java中的浅复制和深复制,并以Android为背景,结合具体的实例讲解如何实现Java泛型深拷贝...
即深拷贝只对标准的可变数据类型如list、dict等进行递归复制。对于包含自定义对象的列表,深拷贝只复制对象的引用,而不是对象本身。 在实际编程中,使用深拷贝和浅拷贝时,应当留意可能出现的内存开销和性能问题。...
因为SUN的Stack不是严格意义上的stack,因此需要重写下,是这样的
然而,如果列表中包含的是引用类型,如`List<Car>`,那么就需要根据具体需求选择适当的复制策略,可能是浅表复制或者深度复制。 总之,C#中的对象复制是编程中不可或缺的一部分,理解浅表复制和深度复制的概念以及...
当我们处理包含引用类型的集合,如List时,如果直接通过构造函数或Clone方法创建新列表,通常只会得到浅复制的结果。 在标题和描述中提到的问题中,当List中的T是引用类型,如myClass类的实例,直接使用`new List...
- **Dozer库**:允许使用注解来定义复制规则,支持深度复制和类型转换,可以实现不同对象间的复制。 - **ModelMapper库**:提供了`ModelMapper`类,可以通过配置注解自动映射对象,简化了复制过程。 4. **集合与...
广义表(Generalized List)是一种数据结构,它扩展了传统列表的概念,允许...通过不断实践和优化,可以构建更复杂的广义表操作,如复制广义表、查找特定元素、合并广义表等,从而更好地理解和运用这一重要的数据结构。
在C#编程中,有时我们需要创建一个列表(List)的副本,以便在不影响原始列表的情况下进行操作。本文将探讨三种克隆C# List引用类型的方法:反射、JSON序列化(依赖于Newtonsoft.Json库)以及BinaryFormatter序列化。 ...
安装CUDNN时,同样从NVIDIA官网下载对应版本,解压后将包含的库文件复制到CUDA安装目录下的相应位置。 接下来,安装Anaconda,这是一个流行的Python分发版,包含了大量科学计算库和环境管理工具。访问Anaconda官网...
此外,拷贝构造函数和赋值运算符也至关重要,它们处理对象的复制和赋值,确保数据的正确处理。 在C++中,类是定义对象的蓝图,而对象是类的实例。每个类可以有成员变量和成员函数,其中成员函数(方法)负责对象的...
在标准的Image List中,图像通常是索引颜色或16位色,这限制了图像的颜色深度和表现力。然而,"真彩色Image List"解决了这个问题,它支持24位或32位真彩色图像,提供了更丰富的色彩和更真实的图像显示。 1. **真...
在编程领域,特别是Java语言中,深拷贝和浅...通过这样的实现,当你需要复制一个MyStack实例时,无论是通过拷贝构造函数还是`clone()`方法,都能保证列表字段的深度复制,从而得到一个与原对象独立的、完整的新实例。
本篇文章将深入探讨如何进行这些转换以及涉及到的复制(copy)深度问题。 首先,`Array`和`Collection`是Java中两种不同的数据结构。`Array`是一种固定大小的数据结构,用于存储同类型元素的序列,而`Collection`是...
同样,`*`运算符可以用于复制元素,如`str * n`将字符串复制n次,`list * n`或`tuple * n`则将列表或元组重复n次。 `in`和`not in`运算符用于检查元素是否存在于特定的容器(如字符串、列表、元组或字典)中。例如...
要进行深度拷贝(即完全复制对象的所有属性),需实现`Cloneable`接口并重写`clone()`方法。 2. **Arrays类的深拷贝** Java的`Arrays`类提供了`copyOf()`和`copyOfRange()`方法,用于数组的数据复制。这两个方法...