`

JAVA ArrayList深层 拷贝 克隆

    博客分类:
  • JAVA
 
阅读更多

大家应该理解浅拷贝和深拷贝的区别:
浅拷贝:被复制对象的任何变量都含有和原来的对象相同的值,而任何的对其他对象的引用仍然指向原来的对象。对拷贝后的引用的修改,还能影响原来的对象。
深拷贝:把要复制的对象所引用的对象都复制了一遍,对现在对象的修改不会影响原有的对象。
如果大家还不理解,在网上看到一个人的比喻很有意思:
就好比一个爸爸一个儿子
浅拷贝:你克隆一下,只得到一个爸爸,这是浅
深拷贝:你克隆一下,既得到了爸爸,又得到了儿子,这是深
另外,如果你克隆的对象里面还包括其他对象,比如汽车对象里还有座位对象,那么浅的结果就是汽车被拷贝了,座位并没有,深的话,就是一起都拷贝了。
下面,给大家说一下如何实现arraylist的深拷贝的一种实现方式:
有一个类Userinfo,需要实现serializable接口,可以序列化。

package com.b2r.paymentserver;

import java.io.Serializable;

public class Userinfo implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	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;

	}

}

 

 

package com.b2r.paymentserver;

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;

	}

}
 
分享到:
评论

相关推荐

    java ArrayList集合的应用

    用java语言编写一个程序实现学员成绩管理,每个学员包括3门课的成绩,从键盘输入学员信息, 包括学号、姓名、三门课成绩,计算出学员的平均成绩,按照学员平均成绩由大到小排序 插入功能:在排序后的学员成绩表中...

    Java ArrayList实现的快排,归并排序,堆排序

    ArrayList作为Java集合框架中的一员,它提供了丰富的操作接口,包括对元素的添加、删除、修改以及排序等。本篇将重点讲解如何利用ArrayList实现快速排序(Quick Sort)、归并排序(Merge Sort)和堆排序(Heap Sort...

    模拟java ArrayList Iterator

    在Java编程语言中,ArrayList是集合框架中的一种重要数据结构,它是一个动态数组,可以存储任意类型的对象。ArrayList提供了一种高效的方式来管理大量的元素,并且提供了迭代器(Iterator)来遍历这些元素,使得我们...

    java ArrayList的使用与分析

    - 当 ArrayList 的容量不足时,它会自动扩容,但可能会造成不必要的内存分配和拷贝。因此,在创建 ArrayList 时可以预估其大小,以减少扩容操作。 - 不要尝试通过索引越界访问 ArrayList,这会导致 `...

    Java中ArrayList的removeAll方法详解

    ArrayList的removeAll方法详解 ArrayList的removeAll方法是一个常用的集合操作方法,该方法可以从一个ArrayList中删除所有在另外一个集合中的元素。但是,在实际开发过程中,removeAll方法的使用需要 thận重,因为...

    Java中ArrayList的使用方法以及与vector的对比

    Java 中 ArrayList 的使用方法以及与 Vector 的对比 ArrayList 是 Java 中的一种动态数组,它提供了很多有用的特性,例如动态地增加和减少元素,实现了 ICollection 和 IList 接口,灵活的设置数组的大小等。下面...

    java中ArrayList的用法

    ### Java中ArrayList的用法详解 #### 一、概述 `ArrayList`是Java集合框架中的一个动态数组类,它能够存储任意类型的对象,并且在运行时动态调整其大小。这使得`ArrayList`成为处理数量未知的数据集合时的一个非常...

    跟我学Java-day14-ArrayList集合.pdf

    day14-ArrayList集合 1.ArrayList 1.1ArrayList类概述【理解】 什么是集合 提供一种存储空间可变的存储模型,存储的数据容量可以发生改变 ArrayList集合的特点 ...底层是数组实现的,长度可以...array.add("java");

    Java ArrayList教程

    Java ArrayList教程 Java ArrayList是Java集合框架中的一种动态数组,继承了AbstractList,并实现了List接口。ArrayList位于java.util包中,使用前需要引入它。ArrayList是一个可以动态修改的数组,与普通数组的...

    java List 深度复制方法

    List<User> copiedUsers = new ArrayList(originalUsers.size()); for (User user : originalUsers) { copiedUsers.add(DeepCopyHelper.deepCopy(user, User.class)); } ``` 在这个例子中,我们使用了Apache ...

    Java ArrayList

    InitArray自己编写的一个JAVA用的集合类,试试效果如何。

    自定义实现的ArrayList

    自定义实现的ArrayList数据结构,有大量注释以及编写思路,帮助新手用Java语言来实现数据结构

    Java ArrayList.add 的实现方法

    "Java ArrayList.add 的实现方法详解" Java ArrayList 是一种常用的 List 实现, 其中 boolean add(E e) 方法和 void add(int index, E element) 方法是两个重要的实现方法。下面我们将详细介绍这两个方法的实现...

    java中对ArrayList进行排序

    java中对ArrayList进行排序的方法参考

    Java中ArrayList的使用方法简单介绍

    在Java编程语言中,ArrayList是集合框架中的一种重要数据结构,属于List接口的实现类。ArrayList主要用于存储一组有序的、可变大小的对象序列。它的特点是允许快速的随机访问,但插入和删除元素时效率相对较低,因为...

    java关键字ArrayList详解

    Cloneable接口表明ArrayList的对象可以被克隆,而Serializable接口则意味着ArrayList可以进行序列化,以便在网络间或磁盘上进行数据传输和持久化。 字段属性: ArrayList内部使用一个Object类型的数组elementData来...

    ArrayList LinkList和vector的区别

    ArrayList、LinkList和Vector是Java中三个常用的集合类,它们都实现了List接口,但是在实现方式和性能上有所不同。 ArrayList ArrayList是使用数组方式存储数据的,数组元素数大于实际存储的数据,以便增加和插入...

    用java自己实现的arrayList

    用java自己实现的arrayList,比较详细,有助于初学者理解arrayList的基本概念和基础用法

Global site tag (gtag.js) - Google Analytics