Aks*_*mar 0 java collections arraylist
我想要的输出应该是:
[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5]]
通过每次创建新的ArrayList对象
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);
Run Code Online (Sandbox Code Playgroud)
我得到所需的输出
[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5]]
但是,在尝试使用时没有得到相同的结果clear()
(以避免在每次迭代中创建新对象),并且在调用result Arraylist
时也变得空clear()
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);
Run Code Online (Sandbox Code Playgroud)
我使用clear()得到以下输出
[[], [], [], [], []]
-->不是我想要的输出
如何在不每次创建新对象(ArrayList 对象)并使用clear() 或任何其他概念的情况下实现所需的输出。
指向result and list ArrayList
相同的引用,或者有其他原因导致错误的输出。请让我知道有关 ArrayList 主题的一些我不知道或缺乏的内容。
你说:
\n\n\n结果和列表ArrayList是否指向相同的引用
\n
是的。
\n要添加副本,请更改以下内容:
\nresult.add( list );\n
Run Code Online (Sandbox Code Playgroud)\n\xe2\x80\xa6 为:
\nresult.add( new ArrayList<>( list ) );\n
Run Code Online (Sandbox Code Playgroud)\n您可能会认为这result.add(list);
是添加的内容list
。但不,该调用传递了您命名的对象的引用(指针,内存地址)。的内容与该调用无关。无论是空还是满,列表本身(即容器)就是您要传递给的内容。ArrayList
list
list
add
因此,您将同一个列表添加五次。的所有元素都result
指向同一个列表。如果添加到包含的列表中,所有五个元素都会result
发生变化。如果清除添加的list
,则所有五个元素都会result
看到变化,所有五个元素都result
指向同一个现在为空的列表。
要添加不同的不可修改列表,请调用List.copyOf
.
result.add( List.copyOf( list ) );\n
Run Code Online (Sandbox Code Playgroud)\n要添加不同的可修改列表,请构造新ArrayList
对象。将现有列表传递给新列表的构造函数。
result.add( new ArrayList<>( list ) );\n
Run Code Online (Sandbox Code Playgroud)\n
归档时间: |
|
查看次数: |
755 次 |
最近记录: |