浅复制与深复制的区别浅复制:
被复制对象的所有变量都含有与原有对象相同的value而所有的对其他对象引用仍然指向原来对象.
浅复制仅仅复制对象而没有复制其引用的对象
常见例子
List<Map<String,String>> list1 = new ArrayList<Map<String, String>>();
Map<String,String> map = new HashMap<String, String>();
map.put("name", "xiaoming");
map.put("age", "28");
list1.add(map);
//克隆方法1:利用原list1作为参数直接构造方法生成。
List<Map<String,String>> list2 = new ArrayList<Map<String, String>>(list1);
//克隆方法2:手动遍历将原list1中的元素全部添加到复制表中。
for(int i = 0, l = list1.size(); i < l; i++)
list2.add(list1.get(i)); //克隆方法3:调用Collections的静态工具方法 Collections.copy
List是一个对象,存储类的类型是存储地址.而存储基本类型则存储value.
元素复制下来而不只是复制存储里面的元素.list层实现这个问题
深复制:
被复制对象的所有变量都含有与其原本对象相同的值,除去引用其他对象变量.
引用其他对象的变量也指向被复制的新对象了.总而言之深复制是把原来的对象
把所有对象都复制过来新对象了
把对象写道流里面的过程是叫串行化过程(Serilization),把对象从流中读出来叫并行化(Deserialization)
应当注意是写在流里的对象的一个拷贝,而原对象仍然存在jvm,因此串行化数据只是对象一个拷贝
若深复制一个对象,会常用对象实现Serializable接口,即把对象拷贝到串行化环境中写到并行化的流里面再从流读出来
即可实现深复制
例子:
public List<Map<String,String>> deClone(Object obj) throws IOException,OptionalDataException,ClassNotFoundException{
//将对象写到流里
ByteArrayOutoutStream bo=new ByteArrayOutputStream();
ObjectOutputStream oo=new ObjectOutputStream(bo);
oo.writeObject(obj);//从流里读出来
ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi=new ObjectInputStream(bi);
return(oi.readObject());
}
更多java学习资料可关注:itheimaGZ获取
原文地址:https://www.cnblogs.com/zhuxiaopijingjing/p/12400865.html