所以我定义了2个数组列表,里面有数组列表
ArrayList <ArrayList> var1 = new ArrayList<ArrayList>();
ArrayList <ArrayList> var2 = new ArrayList<ArrayList>();
然后我初始化 var1:
for(i=0;i<3;i++){
var1.add(new ArrayList<Integer>());
var1.get(i).add(1);
}
然后我将 var1 复制到 var2 中并删除 var1..
for(int k=0;k<var1.size();k++){
var2.add(var1.get(k));
}
var1.clear();
然后我将 var2 复制到 var1 两次
for(int k=0;k<var2.size();k++){
var1.add(var2.get(k));
for(int k=0;k<var2.size();k++){
var1.add(var2.get(k));
现在最奇怪的事情发生了...数组 var1.get(k)
与 var1.get(k+3)
纠缠在一起...所以 0与 3、1 与 4、2 与 5 按以下方式...
如果我这样做var1.get(0).clear()
它不仅删除了 var1.get(0)
...而且我还删除了 var1.get(3)
如果我这样做 var1.get(0).add(1)
... 它不仅将整数 1 添加到 var1.get(0)
中,而且还将其添加到 var1.get(3)
此外,如果我执行var2.clear()
,它也会清除var1
请问有好心人可以告诉我为什么会发生这种魔法吗?
正确的做法是什么?
谢谢
最佳答案
您的最后两个循环(我假设它们不是嵌套的,因为否则此代码将无法通过编译)从 var2
复制每个内部 List
引用两次到 var1
:
for(int k=0;k<var2.size();k++) {
var1.add(var2.get(k));
}
for(int k=0;k<var2.size();k++) {
var1.add(var2.get(k));
}
因此 var1.get(0)==var1.get(3)
, var1.get(1)==var1.get(4)
& var1.get(2)==var1.get(5)
。
因此,当您清除 var1.get(i)
引用的 List
时,您也会清除 var1 引用的
(因为它是相同的List
.get(i+3)List
)。
Also, if I do var2.clear() it also clears var1
你一定是搞错了。仅当您将 var1
分配给 var2
时才会发生这种情况,反之亦然。
And what is the correct way of doing it?
如果您希望 var1
包含 var2
每个元素的两个副本,则必须创建内部 ArrayList
的副本:
for(int k=0;k<var2.size();k++) {
var1.add(new ArrayList<>(var2.get(k)));
}
for(int k=0;k<var2.size();k++) {
var1.add(new ArrayList<>(var2.get(k)));
}
关于java - Java 中纠缠的 ArrayLists...非常奇怪的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46998340/