Java ArrayList<;ArrayList>&燃气轮机;由正在添加的ArrayList备份

Java ArrayList<;ArrayList>&燃气轮机;由正在添加的ArrayList备份,java,arraylist,collections,Java,Arraylist,Collections,我正在创建一个ArrayList的ArrayList,并向其中添加ArrayLists。但是每次我对ArrayList进行更改时,它都会反映在ArrayList中 例如: List list1=new ArrayList(); List list2=新的ArrayList(); 清单2.添加(“Cat”); 列表1.添加(列表2)//没问题 清单2.clear(); 清单2.添加(“狗”); 列表1.添加(列表2)//问题这次猫被两只狗取代了!! 如何确保对list2的更新不会反映在list1

我正在创建一个
ArrayList
ArrayList
,并向其中添加
ArrayLists
。但是每次我对
ArrayList
进行更改时,它都会反映在
ArrayList

例如:

List list1=new ArrayList();
List list2=新的ArrayList();
清单2.添加(“Cat”);
列表1.添加(列表2)//没问题
清单2.clear();
清单2.添加(“狗”);
列表1.添加(列表2)//问题这次猫被两只狗取代了!!

如何确保对
list2
的更新不会反映在
list1
中?

我从以下等效但可运行的程序中观察到的内容:

import java.util.List;
import java.util.ArrayList;

public class Test1 {


    public static void main(String[] args){

        List<ArrayList<String>> list1 = new ArrayList<ArrayList<String>>();    
        ArrayList<String> list2 = new ArrayList<String>();

        list2.add("Cat");
        System.out.println(list2);

        list1.add(list2); 
        System.out.println(list1);

        list2.clear();
        System.out.println(list2);

        list2.add("Dog");
        System.out.println(list2);

        list1.add(list2);
        System.out.println(list2);
        System.out.println(list1);

        if(list1.get(0) == list1.get(1)) {
            System.out.println("Lists at position 0 and 1 are the same");
        }

    }
}
而不是清除列表2并再次添加它

请同时查看以下文章:


  • 简短的回答。。。替换

    list2.clear();
    

    list2=newarraylist();
    
    出现此问题的原因是
    list1.add(list2)
    将对
    list2的引用添加到
    list1
    。它不会在任何时候复制
    list2
    所指的列表。因此,您最终会将对同一列表对象的多个引用添加到
    list1


    这是Java参数传递工作方式的结果,也是集合API设计工作方式的结果。

    被否决,因为我不清楚您的第一句话“但每次我更改ArrayList时,它都会反映在ArrayList中”。此外,如果您使用的是IDE(Eclipse或Intellij),它应该在以下语句中给出一个错误
    List list1=new ArrayList()…谢谢Stephen和nbro,@nbro,不,它没有给我list1=new ArrayList()的错误;。。。你为什么这么认为?我实际上是在创建对象的ArrayList,而不是字符串。我举了一个例子
    
    ArrayList<String> list3 = new ArrayList<String>();
    list3.add("Dog");
    list1.add(list3);
    
    list2.clear();
    
    list2 = new ArrayList<String>();