Java 如何将arraylist复制到不反映原始列表中的更改?

Java 如何将arraylist复制到不反映原始列表中的更改?,java,gwt,Java,Gwt,如何将列表复制到另一个列表,并对新列表中包含的对象进行更改,而不影响旧列表中的对象 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

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

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?
}
class-Foo{
字符串标题;
void setTitle(字符串标题){this.title=title;}
}
列出原件;
List newlist=新阵列列表(原件);
for(Foo-Foo:newlist){
setTitle(“test”);//这也会影响原始列表中的对象。
//我怎样才能避免这种情况?
}

您可以尝试以下操作:

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;
}
public ArrayList deepCopy(ArrayList obj)引发异常
{
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
ObjectOutputStream oos=新的ObjectOutputStream(BAS);
编写对象(obj);
oos.close();
ByteArrayInputStream bins=新的ByteArrayInputStream(baos.toByteArray());
ObjectInputStream oins=新ObjectInputStream(箱);
ArrayList ret=(ArrayList)oins.readObject();
oins.close();
返回ret;
}

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

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

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

//Make changes to newList

您必须克隆原始列表中的对象并将其添加到新列表中您可以克隆,但这可能不是解决方案,请尝试搜索
深度复制
浅层复制
这通常很好,但我在客户端使用GWT,所以不幸的是,我发现我无法使用此。。。
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;
    }
}