`

ArrayList深拷贝的一种实现方法

    博客分类:
  • Java
阅读更多

大家应该理解浅拷贝和深拷贝的区别:

浅拷贝:被复制对象的任何变量都含有和原来的对象相同的值,而任何的对其他对象的引用仍然指向原来的对象。对拷贝后的引用的修改,还能影响原来的对象。

深拷贝:把要复制的对象所引用的对象都复制了一遍,对现在对象的修改不会影响原有的对象。

如果大家还不理解,在网上看到一个人的比喻很有意思:

就好比一个爸爸一个儿子
浅拷贝:你克隆一下,只得到一个爸爸,这是浅
深拷贝:你克隆一下,既得到了爸爸,又得到了儿子,这是深
另外,如果你克隆的对象里面还包括其他对象,比如汽车对象里还有座位对象,那么浅的结果就是汽车被拷贝了,座位并没有,深的话,就是一起都拷贝了。

下面,给大家说一下如何实现ArrayList的深拷贝的一种实现方式:

有一个类Userinfo,需要实现Serializable接口,可以序列化。

Java代码
  1. package test;   
  2.   
  3. import java.io.Serializable;   
  4.   
  5. public class Userinfo implements Serializable    
  6. {   
  7.     private int id;   
  8.     private String name;   
  9.     public int getId() {   
  10.         return id;   
  11.     }   
  12.     public void setId(int id) {   
  13.         this.id = id;   
  14.     }   
  15.     public String getName() {   
  16.         return name;   
  17.     }   
  18.     public void setName(String name) {   
  19.         this.name = name;   
  20.     }   
  21.        
  22. }  

 

下面是我的一个测试类:

 

Java代码
  1. package test;   
  2.   
  3. import java.io.ByteArrayInputStream;   
  4. import java.io.ByteArrayOutputStream;   
  5. import java.io.IOException;   
  6. import java.io.ObjectInputStream;   
  7. import java.io.ObjectOutputStream;   
  8. import java.util.ArrayList;   
  9. import java.util.List;   
  10.   
  11. public class TestMain {   
  12.   
  13.     /**  
  14.      * @param args  
  15.      */  
  16.     public static void main(String[] args) {   
  17.         // TODO Auto-generated method stub   
  18.         List src = new ArrayList(2);   
  19.         Userinfo ui1 = new Userinfo();   
  20.         ui1.setId(1);   
  21.         ui1.setName("aaa");   
  22.         src.add(ui1);   
  23.            
  24.         Userinfo ui2 = new Userinfo();   
  25.         ui1.setId(2);   
  26.         ui1.setName("bbb");   
  27.         src.add(ui2);   
  28.            
  29.         List dest = new ArrayList(2);   
  30.            
  31.         TestMain test = new TestMain();   
  32.        
  33.         try {   
  34.             dest = test.deepCopy(src);   
  35.         } catch (IOException e) {   
  36.             // TODO Auto-generated catch block   
  37.             e.printStackTrace();   
  38.         } catch (ClassNotFoundException e) {   
  39.             // TODO Auto-generated catch block   
  40.             e.printStackTrace();   
  41.         }   
  42.        
  43.            
  44.         System.out.println(src==dest);   
  45.         Userinfo u = (Userinfo)src.get(0);   
  46.         Userinfo uu = (Userinfo)dest.get(0);   
  47.         uu.setName("dkkdkddk");   
  48.         System.out.println(u.getName());   
  49.            
  50.         System.out.println(uu.getName());   
  51.        
  52.     }   
  53.   
  54.     public List deepCopy(List src) throws IOException, ClassNotFoundException{   
  55.         ByteArrayOutputStream byteOut = new ByteArrayOutputStream();   
  56.         ObjectOutputStream out = new ObjectOutputStream(byteOut);   
  57.         out.writeObject(src);   
  58.        
  59.         ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());   
  60.         ObjectInputStream in =new ObjectInputStream(byteIn);   
  61.         List dest = (List)in.readObject();   
  62.         return dest;   
  63.     }   
  64. }  


就是把ArrayList的原来的对象进行序列化,然后通过反序列化读取出来,就可以了。

当然,记着放到集合中的元素也要能够序列化,所以必须实现Serializable接口。

在此,也欢迎大家提出其它的ArrayList深拷贝实现方法。

分享到:
评论
3 楼 KateAndNomi2333 2015-06-12  
kunchong21 写道
tinguo002 写道
List list1 = new ArrayList();
List list2 = new ArrayList(list1);
这样也可以达到深拷贝。

谢谢分享。

这样达成不了深拷贝。
2 楼 kunchong21 2012-05-11  
tinguo002 写道
List list1 = new ArrayList();
List list2 = new ArrayList(list1);
这样也可以达到深拷贝。

谢谢分享。
1 楼 tinguo002 2010-12-16  
List list1 = new ArrayList();
List list2 = new ArrayList(list1);
这样也可以达到深拷贝。

相关推荐

    Java Clone深拷贝与浅拷贝的两种实现方法

    Java Clone 深拷贝与浅拷贝的两种实现方法 Java Clone 是 Java 语言中的一种复制对象的机制,它可以将一个对象的所有属性和状态复制到另一个对象中,实现对象的深拷贝和浅拷贝。下面我们将讨论 Java 中的深拷贝和浅...

    java List 深度复制方法

    为了实现深复制,我们需要创建一个新的List,并逐个复制原始List中的每个元素。如果元素是不可变的(如String、Integer等包装类),那么浅复制和深复制并无太大差异,因为这些对象一旦创建就无法改变。但对于可变...

    详解java中的深拷贝和浅拷贝(clone()方法的重写、使用序列化实现真正的深拷贝)

    本文将深入探讨这两种拷贝方式,并着重讲解如何通过重写`clone()`方法以及使用序列化来实现深拷贝。 1. 浅拷贝: 浅拷贝是指创建一个新对象,该对象拥有原始对象的引用字段的副本。这意味着如果原始对象的字段包含...

    探讨java深拷贝

    另一种实现深拷贝的方法是通过Java的序列化和反序列化机制。首先,让类实现`Serializable`接口,然后将对象转换为字节数组,再将字节数组还原为新的对象。这种方法可以确保所有嵌套的对象都被完整复制,因为序列化...

    java高端技术课程--Java数组如何实现复制

    这种方法适用于对象数组的深拷贝,因为集合框架中的copy()方法实现了深拷贝。 7. **自定义复制方法** 当需要进行特定的复制逻辑,如条件复制、只复制部分元素时,可以自定义复制方法。这种方式具有更高的灵活性,...

    各种设计模式的实现方法示例

    Java中实现`Prototype`模式可以使用`clone()`方法或者依赖于`Serializable`接口进行深拷贝。 `Visitor`模式将操作行为添加到对象结构中,使得可以对对象进行新的操作而无需修改原有类。在Java中,通常会定义一个...

    关于java中的深copy与浅copy的问题

    在Java中,实现深拷贝通常需要自定义序列化和反序列化的方法,或者使用`java.util.Arrays.copyOf()`或`java.util.ArrayList.clone()`等工具类。 下面通过一个`CopyTest`的例子来进一步解释: ```java public class...

    U10316044_HW5_15_10:(修改MyStack类)重写代码清单11.10中的MyStack类来执行列表字段的深拷贝

    如果列表是`ArrayList`或`LinkedList`的实例,可以调用`clone()`方法,它会返回一个列表的浅拷贝,但对于对象元素,它会递归地调用每个元素的`clone()`方法,从而实现深拷贝。 2. 使用`java.util.stream.Collectors...

    U10316011_HW5_15_10:重写listing11.10中的myStack类以执行列表字段的深拷贝

    在Java中实现深拷贝有几种方法: 1. **序列化和反序列化**:如果对象实现了`Serializable`接口,可以使用`ObjectOutputStream`和`ObjectInputStream`进行序列化和反序列化来创建深拷贝。但这种方法可能不适合所有...

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

    下面是如何在MyStack类中实现深拷贝的一种可能的方式: ```java public class MyStack<T> { private List<T> elements; // 深拷贝构造函数 public MyStack(MyStack<T> original) { this.elements = new ...

    最全java面试题及答案(208道).pdf

    Java中有多种对象拷贝方式,例如浅拷贝、深拷贝等。 JavaWeb JavaWeb是Java中的一种Web开发技术,用于开发Web应用程序。JavaWeb中有多种框架和技术,例如Servlet、JSP、Spring等。 异常 异常是Java中的一种机制...

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

    `Array`是一种固定大小的数据结构,用于存储同类型元素的序列,而`Collection`是Java集合框架的一部分,它是一个接口,定义了对一组对象进行操作的基本方法。`List`、`Set`和`Queue`等接口都继承自`Collection`。 *...

    java代码-使用集合ArrayList对字符串进行存储和管理

    在Java编程语言中,集合框架是管理和操作对象的主要工具,ArrayList是其中的一种核心类型,它属于List接口的实现。ArrayList提供了动态数组的功能,允许我们存储和管理一组对象,特别是字符串在这种场景下非常常见。...

    java最新面试题50道精讲

    注解是一种元数据,提供了一种在代码中添加元信息的方法。注解可以被编译器或JVM在编译时或运行时处理,用于代码生成、验证、配置等目的。Java提供了内置的注解,也可以自定义注解。 基本数据类型和引用数据类型是...

    java30个应该掌握的基础

    抽象类(Abstract Class)是一种不能被实例化的类,它通常包含抽象方法(没有实现体的方法)。抽象类可以被子类继承并提供具体实现。例如,`public abstract class Animal { public abstract String getDescription...

    数据复制代码JAVA

    Java作为一种广泛使用的编程语言,提供了多种方法来实现高效的数据复制。本篇将详细探讨如何使用Java编写数据复制代码,以及它在大数据和并行计算场景中的应用。 1. **基本数据复制** 在Java中,基础的数据复制...

    优质资源汇总【更新ing...】

    Java 泛型是一种类型参数化机制,类型擦除是 Java 泛型的实现机制。 8. == 和 equals 的区别: == 是比较对象的引用,equals 是比较对象的内容。 9. hashCode() 与 equals(): hashCode() 是获取对象的哈希码,...

    java代码-使用集合ArrayList对字符串进行存储和管理 支明超 46

    ArrayList是Java集合框架中的一种重要实现,属于List接口的子类,它提供了动态数组的功能。在这个主题中,我们将深入探讨如何使用ArrayList来存储和管理字符串。 首先,ArrayList的核心概念是基于数组实现的,这...

    Java初级面试题.docx

    Java是一种广泛使用的编程语言,尤其在企业级应用和服务器端开发中占据主导地位。对于初学者来说,了解Java的核心概念和特性是至关重要的。这里我们将深入探讨Java中创建线程的方式、线程池的状态、JDK、JRE、JVM的...

    JavaGuide 面试突击最新版.pdf

    Java是一种面向对象的编程语言,它的主要特点包括:跨平台性、自动内存管理、垃圾回收机制、丰富的类库。JVM(Java虚拟机)是Java程序运行的基础,它负责解释执行字节码。JDK(Java Development Kit)包含了JRE...

Global site tag (gtag.js) - Google Analytics