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 も更新されます

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のすべてのオブジェクトはこのように機能します。式の値は常にプリミティブ値または参照であり、オブジェクトではありません。

2 番目のオブジェクトを作成する場合は、明示的に行う必要があります。

于 2012-10-09T18:29:38.840 に答える
3

のコピーを作成する必要がありますa:

b = new ArrayList<Integer>(a);

これにより、新しいが作成され、ArrayListすべてaの要素が追加されます。

于 2012-10-09T18:29:42.610 に答える