2

如何将一个列表复制到另一个列表,并对新列表中包含的对象进行更改,而不影响旧列表中的对象?

class Foo {
   String title;
   void setTitle(String title) { this.title = title; }
}

List<Foo> original;
List<Foo> newlist = new ArrayList<Foo>(original);

for (Foo foo : newlist) {
   foo.setTitle("test"); //this will also affect the objects in original list.
                         //how can I avoid this?
}
4

2 回答 2

8

您将必须克隆对象,但是您必须实现一个克隆方法才能使其工作。换句话说,没有一个简单、通用的交钥匙解决方案。

List<Foo> original;
List<Foo> newList=new ArrayList<Foo>();

for (Foo foo:original){
    newList.add(foo.clone();
}

//Make changes to newList

在列出的情况下,克隆可能是:

class Foo {

    String title;

    void setTitle(String title) { this.title = title; }

    Foo clone(Foo foo){
        Foo result=new Foo();
        result.setTitle(foo.title);
        return result;
    }
}
于 2013-04-03T21:24:58.450 回答
3

您可以尝试如下:

public ArrayList<Foo> deepCopy(ArrayList<Foo> obj)throws Exception
{
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  ObjectOutputStream oos = new ObjectOutputStream(baos);
  baos.writeObject(obj);
  oos.close();
  ByteArrayInputStream bins = new ByteArrayInputStream(baos.toByteArray());
  ObjectInputStream oins = new ObjectInputStream(bins);
  ArrayList<Foo> ret =  (ArrayList<Foo>)oins.readObject();
  oins.close();
  return ret;
}
于 2013-04-03T21:23:42.647 回答