两个ArrayList具有相同的参考

时间:2012-10-09 18:27:55

标签: java collections arraylist

import java.util.*;

class Test {
    public static void main(String[] args) {
        ArrayList<Integer> a = new ArrayList<Integer>();
        ArrayList<Integer> b = new ArrayList<Integer>();
        //added 0-9 to ArrayList
        for(int i=0;i<9;i++)
        a.add(new Integer(i));

        //initialize the Iterator
        ListIterator<Integer> i = a.listIterator();
        while(i.hasNext())
        System.out.print(i.next());

        System.out.print(" ");

        b = a;
        Collections.shuffle(a);
        //initialized the iterator again and print all the elements
        i = b.listIterator();
        while(i.hasNext())
        System.out.print(i.next());
    }
}

//Output : 012345678 528430617

根据上面的代码,如果我正在洗牌ArrayList,那么ArrayList b也会更新 那么即使在更新之后我怎么能看到它不应该更新b

2 个答案:

答案 0 :(得分:4)

此代码不能按照您的想法执行操作:

b = a;

ba的值均为引用,而非对象。上面的语句只是将a的值复制到b,所以现在两个变量具有相同的值,引用同一个对象。

同一点的另一个证明:

StringBuilder x = new StringBuilder();
StringBuilder y = x;
x.append("foo");
System.out.println(y); // Will print foo

Java中的所有对象都是这样的。表达式的值是始终原始值或引用,从不对象。

如果要创建第二个对象,则需要明确地执行此操作。

答案 1 :(得分:3)

您需要创建a的副本:

b = new ArrayList<Integer>(a);

这将创建一个新的ArrayList并将所有a的元素添加到其中。