64

Possible Duplicate:
How to clone ArrayList and also clone its contents?

trying to make a copy of an ArrayList. The underlying object is simple containing on Strings, ints, BigDecimals, Dates and DateTime object. How can I ensure that the modifications made to new ArrayList are not reflected in the old 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());

Cheers, P

Community
  • 1
  • 1
ajayian
  • 933
  • 3
  • 12
  • 19
  • Java is pass by reference. So initially you have the "same" object reference in both the lists...You'll need to use the `clone()` method. AFAIK you'll have to call it on each item separately – PhD Aug 12 '11 at 15:14

2 Answers2

35

Cloning the objects before adding them. For example, instead of newList.addAll(oldList);

for(Person p : oldList) {
    newList.add(p.clone());
}

Assuming clone is correctly overriden inPerson.

Serabe
  • 3,834
  • 19
  • 24
  • yes, clone is shallow copy, after the clone(), the member in the Person object is still the same reference, so you need to override the clone method according to your needs – Y.L. Oct 16 '16 at 09:27
  • Without the assumption of overriding, default `clone()` is protected. – Adeel Ahmad May 04 '20 at 23:39
25
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;
    }
}

In your executing code:

ArrayList<Person> clone = new ArrayList<Person>();
for(Person p : originalList)
    clone.add(p.clone());