Re: Does the clone() method of ArrayList<> make a copy of the objects
in the ArrayList?
Knute Johnson wrote:
Arne Vajh?j wrote:
xz wrote:
anotherArrayList = (ArrayList<Something>) oneArrayList.clone();
anotherArrayList.get(0).makeSomeChange();
Will the change made in the second line make effect on
oneArrayList.get(0)?
clone is a shallow clone not a deep clone so yes.
Arne
Arne:
I know that it says in the docs that ArrayList.clone() is a shallow copy
and that the elements themselves are not copied. Why then does the
following code produce the following results (or have I gone completely
around the bend today?).
import java.util.*;
public class test9 {
public static void main(String[] args) {
ArrayList<Integer> list1 = new ArrayList<Integer>();
list1.add(10);
list1.add(11);
list1.add(12);
ArrayList list2 = (ArrayList)list1.clone();
list1.set(0,20);
list1.add(30);
for (int i=0; i<list1.size(); i++)
System.out.print(list1.get(i)+" ");
System.out.println();
for (int i=0; i<list2.size(); i++)
System.out.print(list2.get(i)+" ");
}
}
C:\Documents and Settings\Knute Johnson>java test9
20 11 12 30
10 11 12
The difference between a deep and shallow clone is difficult to see if
you only add immutable objects, such as Integer:
import java.util.*;
public class ListCloneTest {
public static void main(String[] args) {
ArrayList<StringBuilder> list1 = new ArrayList<StringBuilder>();
list1.add(new StringBuilder("aaa "));
ArrayList list2 = (ArrayList) list1.clone();
StringBuilder builder = list1.get(0);
builder
.append("Both lists point to the same StringBuilder");
for (int i = 0; i < list1.size(); i++)
System.out.print(list1.get(i) + " ");
System.out.println();
for (int i = 0; i < list2.size(); i++)
System.out.print(list2.get(i) + " ");
}
}
aaa Both lists point to the same StringBuilder
aaa Both lists point to the same StringBuilder
Patricia