[英]Java: ArrayList.clear removes elements from ArrayList passed to Map
[英]Java ArrayList.clear() function
List<List<Integer>> result = new ArrayList<List<Integer>>();
ArrayList<Integer> temp = new ArrayList<Integer>();
temp.add(5);temp.add(6);
result.add(temp);
temp.clear();
我上面寫了類似的代碼,調試代碼時我感到困惑的是,我發現結果包含1的大小,但是應用了clear函數后,值(5,6,...)丟失了,任何人都可以解釋一下為什么?
您有清單清單。 這段代碼之后
List<List<Integer>> result = new ArrayList<List<Integer>>();
ArrayList<Integer> temp = new ArrayList<Integer>();
temp.add(5);temp.add(6);
result.add(temp);
情況看起來像這樣
┌───> 5
result ─────> tmp ───┤
└───> 6
result
列表包含一個元素,即tmp
列表 tmp
列表包含兩個元素5
和6
后
temp.clear();
情況改變為
// ↓↓↓ `temp.clear()` affects only this list
result ─────> tmp
所以現在
tmp
列表為空 result
仍然包含tmp
列表 ,這就是為什么它的大小為1 這行代碼
result.add(temp);
在下一行添加對temp
結果的引用
temp.clear(); // <-- here
清除溫度 我認為您想要一份temp
的副本(這樣您就可以在不改變result
情況下清除temp
),
result.add(new ArrayList<Integer>(temp)); // <-- copy temp.
然后清除temp
不會更改result
的值。
temp
是對ArrayList對象的引用 。
ArrayList<Integer> temp;
這會將引用添加到結果列表。
result.add(temp); // adds a copy of the reference, not a copy of the list.
這將清除原始且唯一的列表( result
列表除外)
temp.clear();
注意:Java僅具有references
和primitives
,沒有其他類型。
我該如何避免這種情況? 復制臨時列表?
為您想要的每個新列表創建一個新列表。 代替temp.clear()調用
temp = new ArrayList<>();
理想情況下,除非它具有相同的用途,否則您甚至不應重用局部變量。
// don't use temp again.
List<Integer> temp2 = new ArrayList<>();
順便說一句,我主張您重新使用可變對象以最大化性能。 只有在測量出分配率的問題並且知道自己在做什么之后,才應該這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.