My desired output should be:
[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5]]
By creating new ArrayList object every time
List<List<Integer>> result = new ArrayList<>(); for(int i = 1; i <= 5; ++i){ List<Integer> list = new ArrayList<>(); for(int j = 1; j <= i; ++j){ list.add(j); } result.add(list); } System.out.println(result);
I am getting the desired output as
[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5]]
But, not getting same result when trying to use clear()
(to avoid creating a new object in each iteration) and also the result Arraylist
gets empty too when invoking clear()
on list Arraylist
List<Integer> list = new ArrayList<>(); List<List<Integer>> result = new ArrayList<>(); for(int i = 1; i <= 5; ++i){ for(int j = 1; j <= i; ++j){ list.add(j); } result.add(list); list.clear(); } System.out.println(result);
I am getting the following output using clear()
[[], [], [], [], []]
–> Not the output I want
How can I achieve the desired output without creating new object(ArrayList Object) everytime and using clear() or any other concept.
Are result and list ArrayList
pointing to the same reference or there is some other reason for the incorrect output. Do let me know of something I am not aware of or lacking regarding ArrayList topic.
Advertisement
Answer
tl;dr
You said:
Are result and list ArrayList pointing to the same reference
Yes.
To add a copy, change this:
result.add( list );
… to this:
result.add( new ArrayList<>( list ) );
Details
You might be thinking that result.add(list);
is adding the contents of list
. But no, that call passes the reference (pointer, memory address) of the ArrayList
object you named list
. The contents of list
are irrelevant to that call. Whether empty or full, the list itself, the container, is what you are passing to add
.
So you are adding the very same list five times. All the elements of result
point to the very same single list. If you add to the contained list, all five elements of result
see that change. If you clear that added list
, all five elements of result
see that change, all five elements of result
point to the same single now-empty list.
To add different unmodifiable lists, call List.copyOf
.
result.add( List.copyOf( list ) );
To add different modifiable lists, construct new ArrayList
objects. Pass an existing list to the constructor of a new list.
result.add( new ArrayList<>( list ) );