2012-02-17 5 views
7

java.lang.String.javaにJavaが表示されるのは、hashcode()の呼び出し後にJavaが生成するのはハッシュコードだけで、それを保存するのですが、コンストラクタでハッシュコードを作成しないのはなぜですか?Java Stringのハッシュコードが遅延生成されるのはなぜですか?

関連するコード:

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; 
} 

は、ほとんどの部分は、コンストラクタに配置することができます。

+0

あなたが受け入れ可能な回答を見つけた場合は、あなたの質問に対する回答があることを人々に知らせるためにそれをチェックすることができます。 –

答えて

13

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

+0

多くの文字列は、その存続期間中に等価チェックされます。ハッシュコードが計算されている場合、2つの不等な文字列が等しいかどうかをチェックするのは一般に非常に高速です。さらに、Javaでの実装を含むいくつかのハッシュコード実装では、2つの文字列を連結するハッシュコードを一定時間(実際には時間O(lgN))計算することは可能ですが、その量は限定されており、定数項は、 )。 – supercat

0

これは本当にこれに関する正しいフォーラムではなく、質問はおそらく閉じられるでしょう。あなたはプログラマーで質問することができます.stackexchange.com。

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

4

ジョシュア・ブロッホは、この習慣を「racy single-check」と呼んでいます。

ジェレミーマンソンは、優れたそれは完了だ理由の説明と理由it'safeがあります。本質的にはon his blog

、構築時に使用すると、ハッシュコードを計算スキップしていくつかの時間を節約します。マルチスレッド環境では、複数のスレッドが同じ計算を行う可能性があるため、これを支払うことになります。

0

2の理由:hashCode()は安くはない

1)コンピューティング:それを必要なときに、より良いだけでそれを行う、文字列の長さにO(n)複雑です。

と:

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

0

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

関連する問題