4

1.最初に 2 つのセットを作成しました。2.1つのセットに要素を追加しました。3.あるセットを別のセットに割り当てます。4.一方のセットで clear が呼び出されると、両方のセットがクリアされます。

誰でも問題を理解するのに役立ちますか?

import java.util.HashSet;
import java.util.Set;

public class SetOperation {

Set<Integer> a = new HashSet<Integer>();
Set<Integer> b = new HashSet<Integer>();

void assignAndClear(){

    a.add(3);
    a.add(7);
    a.add(5);
    a.add(19);
    a.add(99);

    System.out.println("a:" +a );
    System.out.println("b:" +b );

    b=a;

    System.out.println("After assigning");
    System.out.println("a:" +a );
    System.out.println("b:" +b );

    b.clear();

    System.out.println("after clearing");
    System.out.println("a:" +a );
    System.out.println("b:" +b );       
}
public static void main(String[] args) {

    SetOperation sd = new SetOperation();
    sd.assignAndClear();
}
}
4

2 に答える 2

4

あるセットを別のセットに割り当てると、新しいセットは作成されず、既存のセットを指す新しい参照が作成されます。したがって、 を使用してセットに加えた変更は、aに反映されbます。

anyこれは可変オブジェクトにも当てはまります。

ただし、Immutableオブジェクトではありません。

たとえば、次の場合を考えてみましょうString: -

String s = "a";
String s1 = s; // Both `s` and `s1` points to `"a"`

s1 = "b";  // Only s1 will point to "b". `s` still points to "a".

上記の場合、変更はStringsイミュータブルであるため、すべての参照に反映されません。したがって、String に変更を加えると、new object.

しかし、もしあなたがmutable object.: -

Set<String> set = new HashSet<String>();
Set<String> set3 = new HashSet<String>(); // A different set object
Set<String> set2 = set;   // Point to the same set object as "set"

set2.clear();  // Will clear the actual object. Pointed by "set"
// And thus both the reference pointing to that object, will see the change.

set3 = set; // Change reference `set3` to point to the `Set object` pointed by `set`

set3.add("a");  // Will change `set` also.

セットのコピーを作成する場合。このようにしてください: -

Set<String> set1 = new HashSet<String>();
Set<String> set3 = new HashSet<String>(set1);
于 2012-10-14T18:00:07.030 に答える
2

の元のハッシュセットのメモリ ロケーションへの参照を上書きしますb。assign toではなくaintoの要素をコピーする必要があります。bab

試す:

 b = new HashSet<Integer>(a);
于 2012-10-14T18:00:27.453 に答える