- 浏览: 223093 次
- 性别:
- 来自: 烟台
文章分类
最新评论
-
KateAndNomi2333:
<div class="quote_title ...
ArrayList深拷贝的一种实现方法 -
kunchong21:
<div class="quote_title ...
ArrayList深拷贝的一种实现方法 -
suihr:
你设置的操作系统的时区正确吗?
Tomcat5.5时区设置 -
xiao_Yao:
我用windows8 tomcat5.5无法 使用 呀
Tomcat5.5时区设置 -
hftgoodgood:
hftgoodgood 写道 ...
通用权限管理系统设计篇(三)——概要设计说明书
大家应该理解浅拷贝和深拷贝的区别:
浅拷贝:被复制对象的任何变量都含有和原来的对象相同的值,而任何的对其他对象的引用仍然指向原来的对象。对拷贝后的引用的修改,还能影响原来的对象。
深拷贝:把要复制的对象所引用的对象都复制了一遍,对现在对象的修改不会影响原有的对象。
如果大家还不理解,在网上看到一个人的比喻很有意思:
就好比一个爸爸一个儿子
浅拷贝:你克隆一下,只得到一个爸爸,这是浅
深拷贝:你克隆一下,既得到了爸爸,又得到了儿子,这是深
另外,如果你克隆的对象里面还包括其他对象,比如汽车对象里还有座位对象,那么浅的结果就是汽车被拷贝了,座位并没有,深的话,就是一起都拷贝了。
下面,给大家说一下如何实现ArrayList的深拷贝的一种实现方式:
有一个类Userinfo,需要实现Serializable接口,可以序列化。
Java代码
- package test;
- import java.io.Serializable;
- public class Userinfo implements Serializable
- {
- private int id;
- private String name;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
下面是我的一个测试类:
Java代码
- package test;
- import java.io.ByteArrayInputStream;
- import java.io.ByteArrayOutputStream;
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.util.ArrayList;
- import java.util.List;
- public class TestMain {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- List src = new ArrayList(2);
- Userinfo ui1 = new Userinfo();
- ui1.setId(1);
- ui1.setName("aaa");
- src.add(ui1);
- Userinfo ui2 = new Userinfo();
- ui1.setId(2);
- ui1.setName("bbb");
- src.add(ui2);
- List dest = new ArrayList(2);
- TestMain test = new TestMain();
- try {
- dest = test.deepCopy(src);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (ClassNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- System.out.println(src==dest);
- Userinfo u = (Userinfo)src.get(0);
- Userinfo uu = (Userinfo)dest.get(0);
- uu.setName("dkkdkddk");
- System.out.println(u.getName());
- System.out.println(uu.getName());
- }
- public 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;
- }
- }
就是把ArrayList的原来的对象进行序列化,然后通过反序列化读取出来,就可以了。
当然,记着放到集合中的元素也要能够序列化,所以必须实现Serializable接口。
在此,也欢迎大家提出其它的ArrayList深拷贝实现方法。
评论
3 楼
KateAndNomi2333
2015-06-12
kunchong21 写道
tinguo002 写道
List list1 = new ArrayList();
List list2 = new ArrayList(list1);
这样也可以达到深拷贝。
List list2 = new ArrayList(list1);
这样也可以达到深拷贝。
谢谢分享。
这样达成不了深拷贝。
2 楼
kunchong21
2012-05-11
tinguo002 写道
List list1 = new ArrayList();
List list2 = new ArrayList(list1);
这样也可以达到深拷贝。
List list2 = new ArrayList(list1);
这样也可以达到深拷贝。
谢谢分享。
1 楼
tinguo002
2010-12-16
List list1 = new ArrayList();
List list2 = new ArrayList(list1);
这样也可以达到深拷贝。
List list2 = new ArrayList(list1);
这样也可以达到深拷贝。
发表评论
-
eclipse下启动tomcat出现Setting property 'source' to 'org.eclipse.jst.jee.server: '错误的
2012-09-19 13:52 923eclipse下启动tomcat出现Setting pr ... -
java List remove 时的小问题
2011-11-16 17:33 1635From:http://hi.baidu.com/xia ... -
HP ProLiant DL380 G6 服务器 - 内存的插法详解
2011-11-15 14:05 2489HP ProLiant DL380 G6 服务器 - 内 ... -
Tomcat5.5时区设置
2011-10-21 11:00 1999项目中遇到Tomcat时间跟系统时间不一致的情况,在网上 ... -
记录tomcat控制台输出日志
2010-11-11 10:23 1718今天把用了2年的tomcat重新整了下,终于解决了日志的记录 ... -
成功配置tomcat的log4j日志系统,格式:HTML+每天以yyyy-mm-dd.log命名的日志文件
2010-11-11 10:19 6230http://www.blogjava.net/flysky1 ... -
关于img src值为空时,2次请求问题的深入调研
2010-08-25 14:19 1351http://hi.baidu.com/bdui/blog ... -
java String.getBytes()编码问题
2010-07-29 16:11 1670http://hi.baidu.com/miserce/b ... -
Java 中的位运算
2010-06-28 09:50 1073移位运算符 包括: “>> 右移 ... -
设置eclipse启动参数解决内存不足问题
2010-03-16 16:17 1985http://www.21jn.net/html/62/n-5 ... -
JAVA_高级特性(hashCode,clone,比较器,Class反射,序列化)
2010-02-03 10:06 1373http://blog.csdn.net/wjp5536509 ... -
com.mysql.jdbc.CommunicationsException: Communications link failure due to under
2010-01-16 14:08 2569com.mysql.jdbc.CommunicationsEx ... -
java术语(PO/POJO/VO/BO/DAO/DTO)
2010-01-13 16:01 954PO(persistant object) 持久对 ... -
Eclipse下插件安装
2009-11-09 14:09 932Eclipse plugin resource center ... -
Java/J2EE中文问题终极解决之道
2009-10-21 14:23 716Java/J2EE中文问题终极解 ... -
ADO封装类实现文件
2009-09-14 15:51 1295http://developer.51cto.com 2 ... -
使用Java多线程实现任务分发
2009-09-14 10:28 1007使用Java多线程实现任 ... -
ExecutorService来进行线程池的方式实现多线程
2009-09-12 10:16 2167ExecutorService来进行线程池的方式实现多线程 ... -
openssl 生成pem 建立CA
2009-08-24 13:45 2294openssl 生成pem 建立CA 关 ... -
Java删除目录及目录下的所有文件
2009-08-21 15:45 2557Java删除目录及目录下的所有文件 java中删除目录事 ...
相关推荐
Java Clone 深拷贝与浅拷贝的两种实现方法 Java Clone 是 Java 语言中的一种复制对象的机制,它可以将一个对象的所有属性和状态复制到另一个对象中,实现对象的深拷贝和浅拷贝。下面我们将讨论 Java 中的深拷贝和浅...
为了实现深复制,我们需要创建一个新的List,并逐个复制原始List中的每个元素。如果元素是不可变的(如String、Integer等包装类),那么浅复制和深复制并无太大差异,因为这些对象一旦创建就无法改变。但对于可变...
本文将深入探讨这两种拷贝方式,并着重讲解如何通过重写`clone()`方法以及使用序列化来实现深拷贝。 1. 浅拷贝: 浅拷贝是指创建一个新对象,该对象拥有原始对象的引用字段的副本。这意味着如果原始对象的字段包含...
另一种实现深拷贝的方法是通过Java的序列化和反序列化机制。首先,让类实现`Serializable`接口,然后将对象转换为字节数组,再将字节数组还原为新的对象。这种方法可以确保所有嵌套的对象都被完整复制,因为序列化...
这种方法适用于对象数组的深拷贝,因为集合框架中的copy()方法实现了深拷贝。 7. **自定义复制方法** 当需要进行特定的复制逻辑,如条件复制、只复制部分元素时,可以自定义复制方法。这种方式具有更高的灵活性,...
Java中实现`Prototype`模式可以使用`clone()`方法或者依赖于`Serializable`接口进行深拷贝。 `Visitor`模式将操作行为添加到对象结构中,使得可以对对象进行新的操作而无需修改原有类。在Java中,通常会定义一个...
在Java中,实现深拷贝通常需要自定义序列化和反序列化的方法,或者使用`java.util.Arrays.copyOf()`或`java.util.ArrayList.clone()`等工具类。 下面通过一个`CopyTest`的例子来进一步解释: ```java public class...
如果列表是`ArrayList`或`LinkedList`的实例,可以调用`clone()`方法,它会返回一个列表的浅拷贝,但对于对象元素,它会递归地调用每个元素的`clone()`方法,从而实现深拷贝。 2. 使用`java.util.stream.Collectors...
在Java中实现深拷贝有几种方法: 1. **序列化和反序列化**:如果对象实现了`Serializable`接口,可以使用`ObjectOutputStream`和`ObjectInputStream`进行序列化和反序列化来创建深拷贝。但这种方法可能不适合所有...
下面是如何在MyStack类中实现深拷贝的一种可能的方式: ```java public class MyStack<T> { private List<T> elements; // 深拷贝构造函数 public MyStack(MyStack<T> original) { this.elements = new ...
Java中有多种对象拷贝方式,例如浅拷贝、深拷贝等。 JavaWeb JavaWeb是Java中的一种Web开发技术,用于开发Web应用程序。JavaWeb中有多种框架和技术,例如Servlet、JSP、Spring等。 异常 异常是Java中的一种机制...
`Array`是一种固定大小的数据结构,用于存储同类型元素的序列,而`Collection`是Java集合框架的一部分,它是一个接口,定义了对一组对象进行操作的基本方法。`List`、`Set`和`Queue`等接口都继承自`Collection`。 *...
在Java编程语言中,集合框架是管理和操作对象的主要工具,ArrayList是其中的一种核心类型,它属于List接口的实现。ArrayList提供了动态数组的功能,允许我们存储和管理一组对象,特别是字符串在这种场景下非常常见。...
注解是一种元数据,提供了一种在代码中添加元信息的方法。注解可以被编译器或JVM在编译时或运行时处理,用于代码生成、验证、配置等目的。Java提供了内置的注解,也可以自定义注解。 基本数据类型和引用数据类型是...
抽象类(Abstract Class)是一种不能被实例化的类,它通常包含抽象方法(没有实现体的方法)。抽象类可以被子类继承并提供具体实现。例如,`public abstract class Animal { public abstract String getDescription...
Java作为一种广泛使用的编程语言,提供了多种方法来实现高效的数据复制。本篇将详细探讨如何使用Java编写数据复制代码,以及它在大数据和并行计算场景中的应用。 1. **基本数据复制** 在Java中,基础的数据复制...
Java 泛型是一种类型参数化机制,类型擦除是 Java 泛型的实现机制。 8. == 和 equals 的区别: == 是比较对象的引用,equals 是比较对象的内容。 9. hashCode() 与 equals(): hashCode() 是获取对象的哈希码,...
ArrayList是Java集合框架中的一种重要实现,属于List接口的子类,它提供了动态数组的功能。在这个主题中,我们将深入探讨如何使用ArrayList来存储和管理字符串。 首先,ArrayList的核心概念是基于数组实现的,这...
Java是一种广泛使用的编程语言,尤其在企业级应用和服务器端开发中占据主导地位。对于初学者来说,了解Java的核心概念和特性是至关重要的。这里我们将深入探讨Java中创建线程的方式、线程池的状态、JDK、JRE、JVM的...
Java是一种面向对象的编程语言,它的主要特点包括:跨平台性、自动内存管理、垃圾回收机制、丰富的类库。JVM(Java虚拟机)是Java程序运行的基础,它负责解释执行字节码。JDK(Java Development Kit)包含了JRE...