なぜJava String Hash Codeが怠けているのですか?
-
26-10-2019 - |
質問
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回計算されます - 異なる場所と時間だけです。