所以,我有这个用例:
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
有两个String元素。然后我创建一个新的(?)ArrayList,test2
,它与test1
相同。当我从test2
删除第一个元素(即“string1”)然后尝试显示test1
中的第一个元素时,它返回“string2”...还有第一个元素“string1”以某种方式删除。
这怎么可能?
答案 0 :(得分:1)
然后我创建一个新的(?)ArrayList,test2,它与test1相同。
不,你没有。你刚刚把你的arraylist 2指向了arraylist 1.
您可以使用列表的Shallow构造函数或使用addAll方法。
List<String> test2 = new ArrayList<String>();
test2.addAll(test1);
答案 1 :(得分:0)
您要将read()
的引用分配给test1
。这意味着,test2
都引用同一个实例,
因此,调用一个方法,实际上也会反映在另一个方面,因为它们指的是同一个对象。
要实现您的目标,请执行
ArrayList
这会将List<String> test2 = new ArrayList<>(test1);
的内容复制到test1
。
答案 2 :(得分:0)
使用与test1
相同的元素创建一个新的 ArrayListArrayList<String> test2 = new ArrayList<>(test1)
答案 3 :(得分: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<>();
在调试中运行代码时,您可以看到test1和test2的引用指向同一位置。这是因为您没有复制值,而是将相同的引用分配给其他列表。请注意,test3的引用与其他2的引用不同。
只需复制您可以使用的值
test2 = new ArrayList<Object>(test1);
请查看下面附带的图像以查看参考值。