如何制作Java ArrayList的深层副本

Pnu*_*utz 50 java arraylist deep-copy

可能重复:
如何克隆ArrayList并克隆其内容?

试图制作一个ArrayList的副本.底层对象很简单,包含字符串,整数,BigDecimals,Dates和DateTime对象.如何确保对新ArrayList所做的修改不会反映在旧的ArrayList中?

Person morts = new Person("whateva");

List<Person> oldList = new ArrayList<Person>();
oldList.add(morts);
oldList.get(0).setName("Mortimer");

List<Person> newList = new ArrayList<Person>();
newList.addAll(oldList);

newList.get(0).setName("Rupert");

System.out.println("oldName : " + oldList.get(0).getName());
System.out.println("newName : " + newList.get(0).getName());
Run Code Online (Sandbox Code Playgroud)

干杯,P

Ser*_*abe 32

在添加对象之前克隆对象.例如,而不是newList.addAll(oldList);

for(Person p : oldList) {
    newList.add(p.clone());
}
Run Code Online (Sandbox Code Playgroud)

假设clone正确覆盖了Person.


小智 20

public class Person{

    String s;
    Date d;
    ...

    public Person clone(){
        Person p = new Person();
        p.s = this.s.clone();
        p.d = this.d.clone();
        ...
        return p;
    }
}
Run Code Online (Sandbox Code Playgroud)

在执行代码中:

ArrayList<Person> clone = new ArrayList<Person>();
for(Person p : originalList)
    clone.add(p.clone());
Run Code Online (Sandbox Code Playgroud)

  • @Wulf`String`不是Java中的原始数据类型 (33认同)
  • "克隆没有意义"与"你无法克隆"不同 (14认同)
  • @ataulm String在Java中是不可变的.既然你无法改变它们,克隆它们是没有意义的. (6认同)