2015-07-20 74 views
1

如果我創建一個列表並添加十個元素,然後將該列表對象複製到另一個列表中,並在第二個列表中調用list.clear,則清除這兩個列表。這是處理列表時的正確行爲嗎?

Random random = new Random(); 
List<Double> list1 = new ArrayList<Double>(); 
List<Double> list2 = new ArrayList<Double>(); 

for (int i = 0; i < 10; i++) { 
    list1.add(random.nextDouble()); 
} 

list2 = list1; //Both lists have ten elements 

list1.clear(); //Both lists are now empty 

這是正常的嗎?我錯過了什麼嗎? 如果我遍歷第一個列表並逐個添加元素,則不會發生,只能使用list2 = list1行。

+1

可能的重複[如何將一個ArrayList的內容複製到另一個?](http://stackoverflow.com/questions/8441664/how-do-i-copy-the-contents-of-one-arraylist -into-another) – m0skit0

回答

5
list2 = list1; //Both lists have ten elements 

這不復制list1list2。它使變量list2引用與list1相同的列表。這兩個變量指向相同的列表對象。

以前

list1 -----> [ArrayList #1] 

list2 -----> [ArrayList #2] 

list1 --+--> [ArrayList #1] 
     | 
list2 --+ [ArrayList #2] (orphaned, will be garbage collected) 

要第一個列表中的元素複製到第二個,而不是做:

list2.addAll(list1); 

(如果list2 WER en't空,您還需要list2.clear()

1

我認爲這是因爲這兩個列表都指向內存中的相同值。只需用foreach循環填充列表。

+1

而不是'foreach',應該使用['addAll(Collection c)'](https://docs.oracle.com/javase/8/docs/api/java/util/List的.html#中的addAll-java.util.Collection-)。這可以更高效。 – Turing85

2
list2 = list1; 

這不復制list1list2,反而使得list2引用(點)列表1。由於list1list2現在都指向相同的列表,所以如果您使用list1list2,則無關緊要,因爲兩者都將在同一個列表中執行操作。

如果你想複製它,做(添加元素後):

final List<Double> list2 = new ArrayList<Double>(list1); 

這也意味着,List<Double> list2 = new ArrayList<Double>()是多餘的。