2010-04-07 72 views
13

我需要一個java的ArrayList的淺拷貝,我應該使用clone()或迭代原始列表和複製的元素新的ArrayList,這是更快?ArrayList的淺拷貝迭代或克隆()

+1

在輸入問題時,您應該已經看到相關問題的列表已經彈出(與您在本頁右下欄中看到的列表相同)。你在他們周圍偷看了嗎?爲什麼這些答案不夠?請詳細說明。 – BalusC 2010-04-07 13:56:41

+0

我確實去了彈出。在ArrayList迭代器和clone()方面沒有任何關係。 – tech20nn 2010-04-07 14:13:38

回答

9

使用clone(),或者使用拷貝構造函數。

的拷貝構造使得從傳遞的集合到陣列的額外變換,而clone()方法直接使用內部陣列。

請記住,clone()返回Object,所以你將不得不投入List

+0

正是我看了看java.util.ArrayList的源代碼,並沒有發現克隆()使用Array.copyof,這將是更爲有效的比遍歷原數組列表。 公共對象的clone(){ 嘗試{ @SuppressWarnings( 「未登記」) ArrayList的 V =(ArrayList的)super.clone()來; v.elementData = Arrays.copyOf(elementData,size); v.modCount = 0; return v; (CloneNotSupportedException e){ //這不應該發生,因爲我們是可以複製的 throw new InternalError(); } } – tech20nn 2010-04-07 14:18:42

+1

我不會太在意效率。使用clone()是一種痛苦;按照建議使用轉換構造函數。 – 2010-04-07 18:34:01

+2

@Kevin Bourrillion爲什麼你認爲使用clone()'很痛苦?實現'clone()'是痛苦的,而不是使用它。 – Bozho 2010-04-07 19:08:54

8

而不是手動迭代,您可以使用copy constructor

至於那之間的速度差和使用clone()

  1. 不要緊
  2. 很可能是沒有
  3. 做一個標杆您的特定系統配置和使用情況
+0

@ Michael ..謝謝。我檢查了複製構造函數的代碼。它有額外的步驟來返回Bozho提到的複製內部數組結構。 public ArrayList(Collection c){ elementData = c.toArray(); size = elementData.length;如果(elementData.getClass()!= Object []。class) elementData = Arrays.copyOf(elementData,size,Object []。class); } – tech20nn 2010-04-07 14:28:28

+0

我喜歡通用的「我應該優化嗎?」思維模式 – 2016-01-05 15:51:03

-1

問題說shallowcopy不直接deepcopy.Copying從一個ArrayList中提到的另一個參考還將努力right.Deep副本複印件包括個人元素在arraylist中。

ArrayList<Integer> list=new ArrayList<Integer>(); 
list.add(3); 
ArrayList<Integer> list1=list; //shallow copy... 

這裏有什麼問題嗎?

+2

這是錯誤的。 所有這些都會使內存中有兩個指向物理ArrayList對象的指針。向一個列表中添加一個「Integer」使得「Integer」也出現在另一個列表中。這不是我們想要的。 淺拷貝使底層對象共享相同的內存空間,但列表具有單獨的內存空間。所以如果你修改一個'Integer',它將在這兩個列表中被修改。但是如果你將一個Integer加入到一個列表中,它不會出現在另一個列表中。 深度複製不會在其他列表中反映任何更改。 – Antimonit 2014-11-22 13:51:18