ArrayList深拷贝的一种实现方法
2016-10-20 17:25
357 查看
原帖地址:http://suihr.javaeye.com/blog/469616
大家应该理解浅拷贝和深拷贝的区别:
浅拷贝:被复制对象的任何变量都含有和原来的对象相同的值,而任何的对其他对象的引用仍然指向原来的对象。对拷贝后的引用的修改,还能影响原来的对象。
深拷贝:把要复制的对象所引用的对象都复制了一遍,对现在对象的修改不会影响原有的对象。
如果大家还不理解,在网上看到一个人的比喻很有意思:
就好比一个爸爸一个儿子
浅拷贝:你克隆一下,只得到一个爸爸,这是浅
深拷贝:你克隆一下,既得到了爸爸,又得到了儿子,这是深
另外,如果你克隆的对象里面还包括其他对象,比如汽车对象里还有座位对象,那么浅的结果就是汽车被拷贝了,座位并没有,深的话,就是一起都拷贝了。
下面,给大家说一下如何实现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深拷贝实现方法。
大家应该理解浅拷贝和深拷贝的区别:
浅拷贝:被复制对象的任何变量都含有和原来的对象相同的值,而任何的对其他对象的引用仍然指向原来的对象。对拷贝后的引用的修改,还能影响原来的对象。
深拷贝:把要复制的对象所引用的对象都复制了一遍,对现在对象的修改不会影响原有的对象。
如果大家还不理解,在网上看到一个人的比喻很有意思:
就好比一个爸爸一个儿子
浅拷贝:你克隆一下,只得到一个爸爸,这是浅
深拷贝:你克隆一下,既得到了爸爸,又得到了儿子,这是深
另外,如果你克隆的对象里面还包括其他对象,比如汽车对象里还有座位对象,那么浅的结果就是汽车被拷贝了,座位并没有,深的话,就是一起都拷贝了。
下面,给大家说一下如何实现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深拷贝实现方法。
相关文章推荐
- 【转】ArrayList深拷贝的一种实现方法
- ArrayList深拷贝的一种实现方法
- ArrayList深拷贝的一种实现方法
- 实现深拷贝的一种方法
- 深拷贝的一种实现方法
- 一种Windows下线程同步的实现方法(很久以前未发表的文章,就当是消遣吧)
- Delphi中实现文件拷贝的三种方法
- PHP实现3维饼图另外一种方法
- PHP实现文件上传的一种好方法
- 实现文件拖放的一种简洁方法
- 【转贴】一种在BIOS中嵌入应用程序的方法及实现
- 虚拟拨号上网模式下实现双机共享上网的一种最省钱的方法
- 一种简单方法实现页面导出(Excel)功能 选择自 xieyun1977 的 Blog
- 用序列化方法实现的Prototype的深拷贝
- 【转贴】一种在BIOS中嵌入应用程序的方法及实现
- ATL实现Connection Point的一种简单的方法
- asp.net实现组合查询的一种方法
- 网站登录记忆跳转实现的一种方法 [摘]
- 一种读写可并发进行的队列的实现方法
- 利用存储过程实现交叉表格式数据查询的一种通用方法