1

不変クラス String の場合。String :: hashCode計算は、そのオブジェクトの存続期間中に 1 回だけ行われます。したがってhashCode()、最初の呼び出しの後に呼び出すと、常に単に返されprivate int hashます。計算に CPU が浪費されることはありません。

public int hashCode() {
    int h = hash;
    if (h == 0 && value.length > 0) {    // **h != 0 in second time**
        char val[] = value;

        for (int i = 0; i < value.length; i++) {
            h = 31 * h + val[i];
        }
        hash = h;
    }
    return h;
}

ハッシュコードとイコールの間の契約を知っているように

equal objects must produce the same hash code

したがって、以下のコードにより、文字列 equals() のパフォーマンスが向上すると思います。ハッシュマップはすでにハッシュコードに基づいてバケットを取得しているため、これはハッシュマップでは冗長である可能性がありますが、これにより BIG リスト検索のパフォーマンスが向上します。

//Does the below will improve equals performance on BIG LIST?
if (this.hashCode() != anObject.hashCode()) {
        return false;
}

以下のAPIにあなたの考えをコメントしてください。

public boolean equals(Object anObject) {
if (this == anObject) {
    return true;
}

if (this.hashCode() != anObject.hashCode()) {
    return false;
}

if (anObject instanceof String) {
    String anotherString = (String)anObject;
    int n = count;
    if (n == anotherString.count) {
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = offset;
    int j = anotherString.offset;
    while (n-- != 0) {
        if (v1[i++] != v2[j++])
        return false;
    }
    return true;
    }
}
return false;
}

アップデート

「dasblinkenlight」で述べたように、hashcode() API が最初に呼び出されたときにのみ必要な CPU サイクルがいくつかあります。

Java は String Pool を維持しているため。アプリケーションがハッシュ時以外に大きな文字列を複数回比較する必要がある場合。次に、以下のように Utility メソッドに進みます。

public boolean StringCompare (String one, String two) {

     if (one == two) {
         return true;
     }

     if (one.hashCode() != two.hashCode()) {
        return false;
     }


    int n = one.count;
    if (n == two.count) {
    char v1[] = one.value;
    char v2[] = two.value;
    int i = one.offset;
    int j = two.offset;
    while (n-- != 0) {
        if (v1[i++] != v2[j++])
        return false;
    }
    return true;

}

4

3 に答える 3

8

比較がほとんどの場合失敗することがわかっている場合、同等性チェックを節約するために独自のコードにそのようなチェックを入れることには何の問題もありませんが、これを一般的なコードに入れると、全体的なパフォーマンスが低下する可能性があります。次の 2 つの理由からシステムを使用します。

  • 初めてハッシュ コードを計算するには、ある程度の CPU サイクルが必要です。メソッドがequalsハッシュ コンテナーのコンテキスト外で呼び出されると、ハッシュ コードの計算に必要な CPU サイクルが無駄になります。
  • Strings がハッシュ コンテナー内のキーとして使用される場合、コンテナーは等価性チェックに進む前にハッシュ コードの等価性を確立するため、メソッド内のハッシュ コードの比較は冗長equals()になります。
于 2013-09-02T18:32:21.147 に答える