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
答案 0 :(得分:4)
此代码不能按照您的想法执行操作:
b = a;
b
和a
的值均为引用,而非对象。上面的语句只是将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
的元素添加到其中。