3

次のコードを検討してください。

6.  Set<Integer> set = new HashSet<Integer>();
7.  Integer i1 = 45;
8.  Integer i2 = 46;
9.  set.add(i1);
10. set.add(i1);
11. set.add(i2); System.out.print(set.size() + " ");
12. set.remove(i1); System.out.print(set.size() + " ");
13. i2 = 47;
14. set.remove(i2); System.out.print(set.size() + " ");
15. System.out.println(set.contains(i2));

コードは次を出力します。

2 1 1 false

14行目以降、サイズは になると思いました0が、 です1。13 行目で新しいオブジェクトi2がセットに追加されていると思われるので、15 行目でテストしましたが、返されますfalse(つまりi2、セットに存在しません)。なぜですか?

4

3 に答える 3

6

14 行目のセットから実際に何かを削除することi2はありません。これは、前の行でセットにない別の何かに再割り当てしているためです。13 行目を完全に削除するとどうなるか見てみましょう。

PS set の remove メソッドは実際にはブール値を返すため、実際に削除されたSystem.out.println(set.remove(i2))かどうかを確認するために使用できますi2

于 2012-09-02T13:59:03.220 に答える
2

[45,46]-> Remove 45-> [46]-> Remove 47-> [46]47 が存在しないため。また、オートボクシング参照で i2 を割り当てると変更されますが、ハッシュセットにはまだ古い値が含まれています。

于 2012-09-02T14:05:37.873 に答える
2

1.セットは、データの一意性を維持します。

したがって、そのset中のすべてのデータを追加した後は

[46, 45]

このトレースを参照してください...

[46,45]

set.remove(i1)

[46]

i2 = 47;
set.remove(i2);

[46] // as i2 = 47, but you didn't add it to the set

i2 = 47そのため、セットに含まれていないため、false です。

于 2012-09-02T14:11:02.970 に答える