簡體   English   中英

Java ArrayList.clear()函數

[英]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列表包含兩個元素56

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僅具有referencesprimitives ,沒有其他類型。

我該如何避免這種情況? 復制臨時列表?

為您想要的每個新列表創建一個新列表。 代替temp.clear()調用

temp = new ArrayList<>();

理想情況下,除非它具有相同的用途,否則您甚至不應重用局部變量。

// don't use temp again.
List<Integer> temp2 = new ArrayList<>();

順便說一句,我主張您重新使用可變對象以最大化性能。 只有在測量出分配率的問題並且知道自己在做什么之后,才應該這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM