2017-05-24 116 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