7

java.lang.String.java には、Java が hashcode() の呼び出し後にハッシュコードのみを生成して格納することが示されていますが、コンストラクターでハッシュコードを作成しないのはなぜですか?

関連するコード:

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

    for (int i = 0; i < len; i++) {
        h = 31*h + val[off++];
    }

    hash = h;
}

ほとんどの場合、コンストラクターに配置できます。

4

5 に答える 5

13

使用されない可能性が最も高いハッシュ コードの生成に時間を費やす必要はありません。ほとんどの文字列は、 hashcode() が呼び出されることなく、構築、使用、およびガベージ コレクションが行われます。

于 2012-02-17T00:32:33.117 に答える
5

Joshua Bloch は、こ​​のプラクティスを「際どいシングルチェック」と呼んでいます。

Jeremy Manson は、なぜそれが行われたのか、なぜ安全なのかについて優れた説明をしています:彼のブログ

本質的に、構築時にハッシュコードの計算をスキップすることで時間を節約できます。マルチスレッド環境では、複数のスレッドが同じ計算を実行する可能性があるため、これを支払う必要があります。

于 2012-02-17T00:38:25.327 に答える
0

2 つの理由:

1) コンピューティングhashCode()は安くはありません:O(n)文字列の長さが複雑になるため、必要な場合にのみ実行することをお勧めします。

と:

2) 文字列インスタンスは不変です: それらは決して変更されないため、常にhashCode()最大 1 回計算します。

于 2012-02-17T00:43:07.737 に答える
0

コンストラクターに配置してもメリットはありません。ただし、コンストラクターにある場合は欠点があります。String の hashCode が呼び出されない場合、計算は何も行われませんでした。そして、hashCode() を呼び出すと、両方のケースで 1 回計算されます - 場所と時間が異なるだけです。

于 2012-02-17T00:44:41.603 に答える
0

これは実際には正しいフォーラムではなく、質問はクローズされる可能性があります。Programmers.stackexchange.com で質問してみることができます。

理由の 1 つは、hashCode の計算は安価ではなく、場合によってのみ必要になることです。

于 2012-02-17T00:32:44.200 に答える