当我清除其中一个arraylist时,它会清除该arraylist的所有副本。
ArrayList<String> testa = new ArrayList<String>();
ArrayList<String> testb = new ArrayList<String>();
testa.add("Dog");
testb = testa;
testa.clear();
现在testb也被清除了。反正有没有避免这个?
答案 0 :(得分:3)
由于testb
正在审核testa
。那时更改b也会发生变化。
当你执行testb = testa;
时,就像
+-----+ | testa |--------\ +-----+ \ +----------------+ --->| (same list) | +-----+ / | testa | | testb |--------/ +----------------+ +-----+
如果您不想这样做,请创建新独立ArrayList
。
将实际列表传递给新constructor
,
ArrayList<String> testa = new ArrayList<String>();
testa.add("Dog");
ArrayList<String> testb = new ArrayList<String>(testa);
testa.clear();
或使用addAll
方法
ArrayList<String> testa = new ArrayList<String>();
testa.add("Dog");
ArrayList<String> testb = new ArrayList<String>();
testb.addAll(testa);
testa.clear();
答案 1 :(得分:1)
ArrayList<String> testa = new ArrayList<String>();
ArrayList<String> testb = new ArrayList<String>();
testa.add("Dog");
List<String> testb = new ArrayList<String>(testa);
testa.clear();
答案 2 :(得分:1)
此时:
ArrayList<String> testa = new ArrayList<String>();
ArrayList<String> testb = new ArrayList<String>();
testa
和testb
是他们自己独立的唯一实例,指向两个不同的ArrayList
引用。如果你改变一个,你不会影响另一个。
在此点:
testb = testa;
您现在已将testb
设置为指向与testa
相同的引用。使用testb
完成的任何操作都会影响testa
,反之亦然。
如果您要将testa
中的元素复制到testb
,请使用ArrayList
作为您的参数的新testb
实例:
testb = new ArrayList<>(testa);