java - Java 中纠缠的 ArrayLists...非常奇怪的问题

标签 java arraylist

所以我定义了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/

相关文章:

java - 如何使用 Cassandra 数据库对用户进行身份验证

java - Maven中相同依赖的不同版本

java - 根据迭代次数将字符串用户输入添加到数组列表中

java - 检查字符串是否存在的高效数据结构

java - 从通用结果列表中获取数据并打印

Php递归数组计数

java - 如何制作 .计算器中的按钮

java - 数组中同一索引有两个值

java - 是否在for循环中使用break?

java - 我将如何使用 ArrayList 删除用户在 Java 中指定的索引之前(而不是之后!)的索引?