在定义之前等于不等的两个列表

时间:2018-03-08 07:38:47

标签: java arrays list arraylist

ArrayList<Integer> list1= new ArrayList<>();
ArrayList<Integer> list2= new ArrayList<>();
for(int i=1;i<=5;i++){
list1.add(i);
}
System.out.println("List1 "+list1);
list2=list1;
System.out.println("List2 "+list2 );
list2.add(6);
System.out.println("List1 Changed "+list1 );

输出:

List1 [1, 2, 3, 4, 5]
List2 [1, 2, 3, 4, 5]
List1 Changed [1, 2, 3, 4, 5, 6]

我知道使用list2 = list1,并且在更改list2时,list1也会被更改。但我不希望我的list1改变它。我必须使用list2 = list1,但有没有办法让我只获得List1 [1,2,3,4,5]?

5 个答案:

答案 0 :(得分:3)

如果您希望list2引用与List不同的list1,请复制一份:

更改

list2=list1;

list2 = new ArrayList<>(list1);

请注意,由于您要覆盖List引用的原始list2的引用,因此无需首先创建它:

ArrayList<Integer> list1 = new ArrayList<>();
for(int i = 1; i <= 5; i++) {
    list1.add(i);
}
System.out.println("List1 "+list1);
ArrayList<Integer> list2 = new ArrayList<>(list1);
System.out.println("List2 "+list2);
list2.add(6);
System.out.println("List1 Not Changed "+list1);

答案 1 :(得分:1)

list2=list1;

您正在使用list1引用覆盖list2。如果你想将它们分开,只需添加它们,不要分配

list2.addAll(list1);

答案 2 :(得分:0)

您可以复制列表,而不只是为其分配引用:

list2 = new ArrayList<>(list1);

答案 3 :(得分:0)

list1list2是变量,它们都是ArrayList<Integer>类型对象的引用。它们在执行list2 = list1后具有完全相同的值,该值是对象的地址,而不是对象本身。这意味着在您丢失list2指向的原始列表时,您有两个指向内存中相同位置的变量。

如何保留两个独立的列表,可以添加从list1list2的元素,就像这样

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

或者这个:

List<Integer> list2 = new ArrayList<>();
/*code inbetween*/
list2.addAll(list1);

答案 4 :(得分:0)

    ArrayList<Integer> list1= new ArrayList<>();
    ArrayList<Integer> list2= new ArrayList<>();
    for(int i=1;i<=5;i++){
    list1.add(i);
    }
    System.out.println("List1 "+list1);
    list2=(ArrayList<Integer>) list1.clone();
    System.out.println("List2 "+list2 );
    list2.add(6);
    System.out.println("List1 Changed "+list1 );