2017-05-24 111 views
0

所以,我有這個用例:ArrayList從其他ArrayList中刪除對象?

ArrayList<String> test1 = new ArrayList<String>(); 
test1.add("string1"); 
test1.add("string2"); 

ArrayList<String> test2 = test1; 
test2.remove(0); 
System.out.println(test1.get(0)); // Expect to see "string1" 

第一個ArrayList中test1,有兩個字符串元素。然後我創建一個新的(?)ArrayList,test2,與test1相同。當我從test2(這是「string1」)中刪除第一個元素,然後嘗試顯示test1中的第一個元素時,它將返回「string2」...同時第一個元素「string1」以某種方式被刪除。

這怎麼可能?

+6

您使用的是兩個變量 –

回答

1

然後我創建一個新的(?)ArrayList,test2,它與test1相同。

不,你還沒有。您剛剛指出您的arraylist 2爲arraylist 1.

您可以使用列表的淺構造函數或使用addAll方法。

List<String> test2 = new ArrayList<String>(); 
test2.addAll(test1); 
0

您指定的test1引用test2。這意味着,這兩個ArrayList指的是同一個實例,因此,在一個實例上調用的方法也會在另一個實際上反映出來,因爲它們指向相同的對象。

達到你想要什麼,做

List<String> test2 = new ArrayList<>(test1); 

這將複製到test1test2內容。

0

有着相同元素爲Test1

ArrayList<String> test2 = new ArrayList<>(test1) 
+0

爲什麼不'ArrayList的測試2 =新的ArrayList <>(測試1)'ArrayList中的同一個實例?你認爲'Arrays.asList()'增加了什麼圖片? –

0
ArrayList<String> test1 = new ArrayList<String>(); 
    test1.add("string1"); 
    test1.add("string2"); 

    ArrayList<String> test2 = test1; 
    test2.remove(0); 
    System.out.println(test1.get(0)); // Expect to see "string1" 

    ArrayList<String> test3 = new ArrayList<>(); 

當運行在調試的代碼,你可以看到,測試1和測試2的參考指向同一位置創建一個新的ArrayList 。這是因爲您沒有複製這些值,而是將相同的引用分配給另一個列表。請注意,TEST3的參考比其他2

不同爲了剛纔複製的值,可以使用

test2 = new ArrayList<Object>(test1); 

請從下面連接查看參考值的圖像。

Result of running the code stated above in debug