質問

java.lang.string.javaには、JavaがHashCode()への呼び出しの後に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;
}

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

役に立ちましたか?

解決

なぜ使用されない可能性が高いハッシュコードを生成するのに時間を費やすのですか?ほとんどの文字列は構築され、使用され、ハッシュコード()が呼び出されることなく収集されます。

他のヒント

ジョシュア・ブロッホは、この練習を「際どいシングルチェック」と呼んでいます。

ジェレミー・マンソンは、なぜそれが行われたのか、なぜそれがなぜそうなのかについて優れた説明を持っています: 彼のブログで

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

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

1つの理由は、コンピューティングハッシュコードが安くなく、場合によってのみ必要であることです。

2つの理由:

1)コンピューティング hashCode() 安くはありません:です O(n) 文字列の長さの複雑さなので、必要なときにのみ行うことができます。

と:

2)文字列インスタンスは不変です:彼らは決して変わらないので、あなたは常に計算します hashCode() せいぜい一度。

コンストラクターに配置する場合、利点はありません。しかし、それがコンストラクターにあるとき、欠点があります。文字列のハッシュコードが呼び出されない場合、計算は何のために行われません。また、HashCode()を呼び出すと、両方の場合に1回計算されます - 異なる場所と時間だけです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top