0

ハッシュコード値が同じなのはなぜですか?

public static void main(String args[])
{
    String s1="abc";
    String s2=new String("abc");
    System.out.println("Hashcode s1-:"+ s1.hashCode());
    System.out.println("Hashcode s2-:"+ s2.hashCode());
    if(s1==s2){
        System.out.println("==true:");
    } 
}

出力

Hashcode s1-:96354
Hashcode s2-:96354
4

9 に答える 9

7

2 つの等しいオブジェクトのハッシュ コードは等しくなければなりません。

この場合、オブジェクトは文字列であり、同じ文字列 "abc" を保持しているため、等しいと見なされます。

等式ではなくオブジェクト ID に基づくハッシュ コードが必要な場合は、 を使用しますSystem.identityHashCode()

于 2013-03-18T09:28:04.950 に答える
3

なぜそれらは同じではないのでしょうか? はhashcode文字列の内容に基づいて計算されるため、両方で同じです。

==オブジェクト参照を比較します。参照に使用new Strings2たものは同じではないためです。

メソッドを使用してequals、値に基づいて文字列が等しいかどうかをテストする必要があります。

于 2013-03-18T09:28:49.380 に答える
2

ハッシュコードは、文字列に存在する文字のみを取り込む式を使用して計算されるためです。a 内の同じ文字は、同じhashcodeStringを生成します。

計算式のJavadoc 。

于 2013-03-18T09:28:59.463 に答える
0

Stringクラスには独自のhashcodeメソッドが実装されています。そのメソッドは、ハッシュコードを次のように計算します。s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

したがって、同じ文字シーケンスのハッシュコードは同じになります。

于 2013-03-18T09:31:58.233 に答える
0

これがすでに存在する場合、JVM は新しい文字列を作成せず、参照を返すだけです。いずれかの変数で実際の文字列を変更しようとすると、新しい文字列が作成されます。アプリケーションのデバッグで確認できます。String オブジェクトのメモリ アドレスは異なりますが、内部の値はまったく同じメモリ アドレスになります。

于 2013-03-18T10:10:46.227 に答える
0

ルールに従って、これらの equals メソッドのオブジェクトは true を返し、同じハッシュコードを持つ必要があります。

于 2013-03-18T09:29:10.977 に答える
0

文字列のハッシュコードはその文字に基づいて計算されるため、equals()

として計算されます。

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

ここで、s[i] は各文字で0<=i<n、n はその長さです。

両方の文字列の内容が同じであるため、ハッシュコードは同じです。

于 2013-03-18T09:29:42.660 に答える
0

これはString、Java でのハッシュコードの計算方法によるものです。

javadoc を確認してください: http://docs.oracle.com/javase/6/docs/api/java/lang/String.html

さらに、2 つの文字列は等しいため、ハッシュコードは同じでなければなりません。

于 2013-03-18T09:28:08.853 に答える
0

これがコードです...したがって、2 つの equals オブジェクトの結果は同じです。

public int hashCode() {
int h = hash;
    int len = count;
if (h == 0 && len > 0) {
    int off = offset;
    char val[] = value;

        for (int i = 0; i < len; i++) {
            h = 31*h + val[off++];
        }
        hash = h;
    }
    return h;
}
于 2013-03-18T09:28:52.117 に答える