2012-09-07 37 views
2

後,我有以下LinkHashMap保留了它的指針,Java的列表實例複製

LinkedHashMap<String, ArrayList<String>> test1=new ... 

在一個循環中我給你這樣的鍵值對,

ArrayList<String> temp=new ... 
//start iteration 
temp.add("some strings") 
test1.put("some string", temp); 
temp.clear()//temp is cleared for next iteration 

這裏溫度是一個臨時列表我之前創建並添加了一些內容。 但問題是,當我清除臨時臨時傳遞給test1也被清除,這意味着它是通過引用複製。如何使用test1中的temp仍然保持其引用。我知道這是一個基本的概念,但我是java的新手,並沒有通過它的所有功能。

回答

6

這是因爲你不是真的複製Listtemp。您正在複製指針(Java語言中的「參考」)。

這裏有兩個簡單的解決方案:

  1. 做使用new ArrayList<String>(temp)List的實際拷貝,你在地圖中存儲的內容。
  2. 而不是做temp.clear(),做temp = new ArrayList<String>()

第二個選項將執行最好的,因爲它沒有製作任何東西的副本;它只是用新的ArrayList替換參考。

+0

它完成了這項工作。 –

1

由於LinkedHashMap.put()方法添加List<T>對象的引用(即,單一對象現在由LinkedHashMapArrayList<String>引用參考並可以操縱經由對象引用對象 - temp變量或test1.get("some strings")),所以不調用clear()方法改爲創建另一個List<T>對象。

ArrayList<String> temp=new ArrayList<String>(); 
temp.add("some strings") 
test1.put("some string", temp); 

temp=new ArrayList<String>(); 
temp.add("foo"); 
test2.put("another string",temp); 
1

有人(主叫方或被呼叫方)需要做的ArrayList的副本由temp解決,或者您需要創建一個新的ArrayList的temp。第二種方法更符合Java的「風格」(因爲被調用者不在你的控制之下,可能是唯一的選擇)。

1

不要爲下一次迭代清除它,只需創建一個新的引用。從列表中刪除所有元素可能會在迭代時成爲性能問題。