0

私は以下を持っています。

HashSet<String> set1 = new HashSet<String>();
HashSet<String> set2 = new HashSet<String>();
String strB1 = "B";
String strB2 = "B";

set1.add( "A" );
set1.add( strB1 );
set2.add( strB2 );

set1.removeAll( set2 ); 

set1には「A」のみが含まれるのでしょうか、それとも「B」も含まれるのでしょうか。

4

2 に答える 2

5

HashSet同一性(「参照が等しい」)ではなく、オブジェクトの等価性( ) を使用します。Object.equals

さらに、ハッシュ関数を使用しますHashSetObject.hashCode

残念ながら、これを「知る」には、ドキュメントを少し「読んで」、ハッシュがどのように実装されているかを知る必要があります。のドキュメントからHashSet.contains

このセットに指定された要素が含まれている場合は true を返します。より正式には、このセットに (o==null ? e==null : o.equals(e) )となる要素 e が含まれている場合にのみ true を返します。

より一般的なSetドキュメントには次のように記載されています。

重複する要素を含まないコレクション。より正式には、セットにはe1.equals(e2)のような要素 e1 と e2 のペアは含まれず、最大でも 1 つの null 要素が含まれます。その名前が示すように、このインターフェイスは数学的集合の抽象化をモデル化します。

などのごくわずかな例外を除いて、JavaIdentityHashMapのデータ構造は同一性ではなく等価性で機能します。

したがって、質問に答えるために、HashSetは「文字列値」で機能します。

(この例は、文字列インターンのために特に誤解を招く可能性がありますが、逆が真でなくても同一性は等しいことを意味するため、上記は変わりません。)

于 2012-07-07T22:41:19.930 に答える
0

Java の文字列は特別に扱われます。最適化のために、文字列リテラルはすべてキャッシュされ、再利用されます。したがって、strB1 と strB2 は同じ参照を保持し、結果として set1 にはコードの実行後に "A" のみが含まれます。

少なくとも Java ドキュメントと SCJP トレーニング ブックによると。

しかし、コメントに投稿されているように、ここに投稿するよりも試してみたほうが早いです...

于 2012-07-07T22:25:35.743 に答える