JAVA ArrayList深层 拷贝 克隆

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

	}

}
 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值