2

以下に示すコードを書いています。

String s1=new String("hi");
System.out.println(s1.hashCode());
String s2=new String("hi");
System.out.println(s2.hashCode());
String s3=s1.intern();
String s4=s2.intern();
System.out.println(s3.hashCode());
System.out.println(s4.hashCode());

コードを実行すると、すべての変数に対して同じハッシュコードが出力されます。

3329
3329
3329
3329

上記のコードの正しい出力ですか?

4

3 に答える 3

7

はい、それは正しい出力です。ofは文字列hashCodeString内容に基づいています(非常に具体的な方法で、上記のリンク先のドキュメントに記載されています)。

s1、およびはすべて同じ内容 ("hi") を持っているため、すべて同じ hashCode を返しますs2s3s4

返されるオブジェクトはとに対して同じ値を返す必要あるため、これは実際に必要ですa.equals(b)truea.hashCode()b.hashCode()

その反対 (つまり、「同じハッシュコードを持つオブジェクトは等しくなければならない」) は正しくなく、一般に行うことさえできないことに注意してください(単純に、String値よりもはるかに多くの可能な値があると考えてください。ピジョンホールの原則intを参照してください)。 )。

于 2012-12-05T12:21:26.600 に答える
3

すべての文字列はequal同じハッシュコードであることは理にかなっています。これはObject で定義された hashcode のコントラクトの一部です:

equals(Object) メソッドに従って 2 つのオブジェクトが等しい場合、2 つのオブジェクトのそれぞれで hashCode メソッドを呼び出すと、同じ整数結果が生成される必要があります。

于 2012-12-05T12:21:52.240 に答える
1

私が間違っている場合は誰かが私を修正しますが、私はそう思います。文字列オブジェクトではなく文字列「こんにちは」のハッシュコードを取得するため、正しい出力です。それがまさに hashcode-method がすべきことです。

于 2012-12-05T12:22:00.720 に答える