浅拷贝与深拷贝
list集合的拷贝:list的本质是数组,数据是以地址的形式进行储存,浅拷贝后的listA与B指向同一个地址。
几种浅拷贝:
1.利用list遍历进行复制
2.使用list实现类的构造方法
3.list.addAll()
4.System.arrayCopy()方法
深拷贝:就是将A复制给B的同时,给B创建新的地址
两种深度拷贝的方法:
1.使用序列化方法进行拷贝:
前提:必须实现list内类的序列化接口
public static <T> List<T> deepCopy(List<T> 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);
@SuppressWarnings("unchecked")
List<T> dest = (List<T>) in.readObject();
return dest;
}
List<Person> destList=deepCopy(srcList); //使用方法进行拷贝
2.clone方法
public class A implements Cloneable {
public String name[];
public A(){
name=new String[2];
}
public Object clone() {
A o = null;
try {
o = (A) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return o;
}
}
for(int i=0;i<n;i+=){
copy.add((A)src.get(i).clone());
}
Java对对象和基本的数据类型的处理是不一样的。在Java中用对象的作为入口参数的传递则缺省为”引用传递”,也就是说仅仅传递了对象的一个”引用”,这个”引用”的概念同C语言中的指针引用是一样的。当函数体内部对输入变量改变时,实质上就是在对这个对象的直接操作。 除了在函数传值的时候是”引用传递”,在任何用”=”向对象变量赋值的时候都是”引用传递”。
idea 实现类的序列化ID自动生成问题:
在File | Settings | Editor | Inspections中进行设置
然后双击类名或者接口名,按alt+enter进入添加