这里用的是clone的方法。
1.建一个实体类:model,他要实现Cloneable,并且重写clone()方法。
public class Model implements Cloneable {
public Model() {
}
public Model(String name, String age) {
super();
this.name = name;
this.age = age;
}
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
protected Model clone() {
Model model = null;
try {
return (Model) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return model;
}
// @Override
// public String toString() {
// return "Model [name=" + name + ", age=" + age + "]";
// }
}
2.然后复制:
public static void main(String[] args) {
List<Model> aa = new ArrayList<>();
aa.add(new Model("aa0","aa0"));
aa.add(new Model("aa1","aa1"));
aa.add(new Model("aa2","aa2"));
aa.add(new Model("aa3","aa3"));
List<Model> bb = new ArrayList<>();
for (Model model : aa) {
bb.add(model.clone());
}
bb.get(0).setAge("bb0");
System.out.println(aa.toString());
System.out.println(bb.toString());
}
打印结果:
[javaTest.Model@71f801f7, javaTest.Model@51493995, javaTest.Model@1e638ee4, javaTest.Model@1a3a2a52]
[javaTest.Model@60b07af1, javaTest.Model@625795ce, javaTest.Model@642c39d2, javaTest.Model@13883d5f]
可以很明显看出地址都是不一样的,说明复制成功。
以上的只在list中对象中没有对象的情况生效,如果list中的对象中还存在对象的情况,这个还不是深度复制。
一下从网上看到的深度复制,可供参考
/**
* 深度复制list对象,先序列化对象,再反序列化对象
*
* @param src 需要复制的对象列表
* @return 返回新的对象列表
* @throws IOException 读取Object流信息失败
* @throws ClassNotFoundException 泛型类不存在
*/
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);
return (List<T>)in.readObject();
}