5

私が言うときJavaで。

String str= "abcd";
str.hashCode(); 

私の質問は、ハッシュコードはいつ計算されますか? @ライン1または@ライン2?

私は、ハッシュコードが事前に計算されていると仮定しています。文字列が更新されるたびに、ハッシュコードも「おそらく」更新されます。

またはその逆です。つまり、Java を呼び出すたびに、ここでstr.hashCode()説明されている式を使用して計算します。

Java 文字列での hashCode() の一貫性

4

6 に答える 6

9

文字列は不変であるため更新できず、値は一度計算された後にキャッシュされます。

public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }
于 2013-07-10T11:39:11.377 に答える
1

String is immutable であるStringため、既存のインスタンスを更新することはできません。できることは、新しいインスタンスを作成し、それを同じ変数に割り当てることです。

于 2013-07-10T11:46:13.273 に答える
1

String.hashCode() メソッドは、Java で作成または使用する他のメソッドと同様に、呼び出したときにのみ起動されます。

したがって、質問に答えるために、文字列の作成時にハッシュコードは計算されません。

ハッシュコード メソッドが表示されている場合は、1 回だけ計算するように記述されており、事前に計算されたハッシュコード値がローカル変数ハッシュに保存されます。

public int hashCode() {
 int h = hash;
 if (h == 0) {
  int off = offset;
  char val[] = value;
  int len = count;
  for (int i = 0; i < len; i++) {
   h = 31*h + val[off++];
  }
  hash = h;
}
return h;
} 

したがって、ハッシュコードはメソッドが呼び出されたときにのみ計算されます

于 2013-07-10T12:19:30.543 に答える
1

文字列を「更新」することはできません。文字列は不変です。文字列インスタンスを「変更」すると、実際には新しい文字列インスタンスが取得されます。

于 2013-07-10T11:37:42.217 に答える
0

この質問はまだ「答えられていない」と思います。グーグルで見つけました。したがって、すべての回答を要約し、さらに価値を追加するには:

  • 文字列の hashCode は、この関数の最初の呼び出しでキャッシュされます。ゼロ初期化された内部フィールド hashCode があります。
  • 文字列は不変ですが、Reflection API を使用して変更できます。それでも、キャッシュされた hashCode は自動的に更新されません
  • 文字定数で初期化された文字列は常にインターンされます。

    public static void main(String[] args) {
        String hello1 = "Hello";
        String hello2 = "Hello";
        System.out.println( hello1 == hello2 );
    }
    

「true」と出力されることを確認できます。hello1 と hello2 の hashCode を呼び出す場合、実際には同じオブジェクトであるため、hashCode は 1 回だけ計算されます。

この情報が、グーグルでそこにたどり着いた人にとって役立つことを願っています。

于 2016-06-29T18:47:47.373 に答える