2013-04-03 2 views
1

Как скопировать список в другой список и внести изменения в объекты, содержащиеся в новом списке, не затрагивая объекты в старом списке?Как скопировать arraylist, чтобы не отражать изменения в исходном списке?

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? 
} 
+3

Вы должны были бы клонировать объекты в исходном списке и добавить их в новый список – MadProgrammer

+3

можно клонировать, но он может не решение , попробуйте найти «глубокую копию» и «мелкую копию» – ogzd

ответ

7

Вы должны клонировать объекты, но тогда вы должны реализовать метод клонирования для того, чтобы работать. Другими словами, нет простого общего решения «под ключ».

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; 
    } 
} 
+0

Это чувствует, что это шаблон, но, вероятно, единственное изменение для меня здесь ... – membersound

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; 
} 
+0

Это хорошо в целом, но я использую GWT на стороне клиента, поэтому, к сожалению, я узнал, что не могу использовать это ... – membersound

Смежные вопросы