On Aug 3, 7:28 pm, Knute Johnson <nos...@rabbitbrush.frazmtn.com>
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();
this line copies every item in list1 into list2 such that
list1.get(i) = list2.get(i) for i = 0, 1, 2,
which means, two references (0th item in list1 and 0th item in list2)
point to the same thing, but they themselves are not identical.
> list1.set(0,20);
now you changed the 0th item in list1, in other words, you let the the
0th item in list1, which is a reference, point to another thing (20).
This process has nothing to do with list2, meaning 0th item in list2
still points to 10.
> 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
>
However, as I konw ArrayList can only deal with classes, e.g. Integer,
but not primitive types like int. How come your code compiles?
|