浅复制与深复制的区别浅复制:
被复制对象的所有变量都含有与原有对象相同的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()); }
|