0
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 a 那么 ArrayList b 也会更新所以即使在更新之后我怎么能看到它不应该更新 b

4

2 回答 2

4

这段代码没有做你认为它做的事情:

b = a;

b和的值a都是引用,而不是对象。上面的语句简单地复制了ato的值b,所以现在两个变量具有相同的值,指的是同一个对象。

同一点的另一个演示:

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

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

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

于 2012-10-09T18:29:38.840 回答
3

您需要创建以下副本a

b = new ArrayList<Integer>(a);

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

于 2012-10-09T18:29:42.610 回答