5

以下の例では、ハッシュセット1のサイズが表示されていますが、3つの文字列値s1、s2、s3を追加するハッシュセットを作成しました。なぜですか。

public static void main(String args[])
{
    String s1="abc";
    String s2=new String("abc");
    String s3="abc";
    Set setdemo=new HashSet();
    setdemo.add(s1);
    setdemo.add(s2);
    setdemo.add(s3);

    System.out.println("s1 hashcode -:"+ System.identityHashCode(s1));
    System.out.println("s2 hashcode -:"+ System.identityHashCode(s2));
    System.out.println("s3 hashcode -:"+ System.identityHashCode(s3));
    System.out.println("Set size is -:"+setdemo.size());
}

出力:

s1 hashcode -:17523401
s2 hashcode -:8567361
s3 hashcode -:17523401
Set size is -:1
4

8 に答える 8

5

セットは重複を許可しません。文字列はプールに入れられるため、すべて同じインスタンスを指します。

于 2013-03-18T09:56:12.683 に答える
2

Duplicate同等のハッシュ コードを持ち、同等trueをテストすると返されると識別されます。

あなたの場合、3つすべてが重複Stringsとして識別され、重複Set排除するため、サイズは1あなたのケースにあります。

于 2013-03-18T09:58:55.790 に答える
0

HashSet では一意のエントリのみが保存されるためです。ここで「abc」は3回追加されているため、何度追加しても文字列abcのみが保存されます

于 2013-03-18T09:57:38.343 に答える
0

各文字列には、hash() 関数によって返される同様の hashCode が含まれます。また、 Set は重複を許可しないため、その位置の以前の値が確実に上書きされます。

于 2013-03-18T10:39:03.007 に答える
0

HashSet は、同じオブジェクトの倍数を格納しません。これは「セット」です。たとえば、Apache Commons Collections または Guava からの MultiSet (Bag とも呼ばれます) 実装を使用する必要があります。これらは、追加したコピーの数も格納します。

于 2013-03-18T09:59:10.887 に答える
0

String クラスのオブジェクトを作成するたびに、値が他の文字列に既に格納されているかどうかを確認します。お気に入り

String s1 = "hello";
String s2 = "hello";

この場合、s1 と s2 に 2 つのメモリ ロケーションを割り当てるのではなく、1 つだけ割り当てます。. equals() オペランドを使用してチェックすると、同じであることが判明したメモリ位置がチェックされます。の :

setdemo.add(s1);
setdemo.add(s1);
setdemo.add(s1);

3 つのメモリ ロケーションを (簡単に言えば) 作成していますが、HashSet が内部で (これも簡単に言えば) .equals をチェックすると、同じメモリ ロケーションが示されるため、HashSet のサイズは 1 になります。

于 2013-04-30T09:31:11.907 に答える
0

HashSet.add

セットに次のようなe要素が含まれていない場合、指定された要素をこのセットに追加しますe2(e==null ? e2==null : e.equals(e2))

したがって、上記の追加操作中は次のようになります。

s2.equals(s1)を返しtrues2追加されません。

s3.equals(s1)を返しtrue、 にs3も追加されませんsetdemo

于 2013-03-18T10:00:09.097 に答える
0

出力を確認する

s1.equals(s2)
s2.equals(s3)

HashSetStringは、オブジェクトが同じかどうかを識別するために equals メソッドを使用するため、同じオブジェクトを何度も追加することを許可しないクラスの equals メソッド。

于 2013-03-21T09:03:31.600 に答える