几种浅拷贝
1、遍历循环复制
List<Person> destList = new ArrayList<Person>(srcList.size());
for(Person p : srcList){
destList.add(p);
}
2、使用List实现类的构造方法
List<Person> destList = new ArrayList<Person>(srcList);
3、使用list.addAll()方法
List<Person> destList = new ArrayList<Person>();
destList.addAll(srcList);
4、使用System.arraycopy()方法
Person[] srcPersons=srcList.toArray(new Person[0]);
Person[] destPersons=new Person[srcPersons.length];
System.arraycopy(srcPersons, 0, destPersons, 0, srcPersons.length);
5、使用Stream的方式copy
List<Person> destList = srcList.stream().collect(Collectors.toList());
深层复制
1.使用序列化方法
/**
* 对集合进行深拷贝
* 注意需要岁泛型类进行序列化(实现serializable)
*
* @param src
* @param <T>
* @return
* @throws IOException
* @throws ClassNotFoundException
*/
public static <T> List<T> deepCopy(List<T> src) {
try (ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream outputStream = new ObjectOutputStream(byteOut);
) {
outputStream.writeObject(src);
try (ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
ObjectInputStream inputStream = new ObjectInputStream(byteIn);
) {
return (List<T>) inputStream.readObject();
}
} catch (Exception e) {
ThrowableUtils.getString(e);
}
return Collections.emptyList();
}
注意,bean必须要序列化
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语言中的指针引用是一样的。当函数体内部对输入变量改变时,实质上就是在对这个对象的直接操作。 除了在函数传值的时候是”引用传递”,在任何用”=”向对象变量赋值的时候都是”引用传递”。
主要就是把这个链接超过来了,看别的要导包,要么要RMB,要么复杂还不行,只为记录