私が言うときJavaで。
String str= "abcd";
str.hashCode();
私の質問は、ハッシュコードはいつ計算されますか? @ライン1または@ライン2?
私は、ハッシュコードが事前に計算されていると仮定しています。文字列が更新されるたびに、ハッシュコードも「おそらく」更新されます。
またはその逆です。つまり、Java を呼び出すたびに、ここでstr.hashCode()
説明されている式を使用して計算します。
私が言うときJavaで。
String str= "abcd";
str.hashCode();
私の質問は、ハッシュコードはいつ計算されますか? @ライン1または@ライン2?
私は、ハッシュコードが事前に計算されていると仮定しています。文字列が更新されるたびに、ハッシュコードも「おそらく」更新されます。
またはその逆です。つまり、Java を呼び出すたびに、ここでstr.hashCode()
説明されている式を使用して計算します。
文字列は不変であるため更新できず、値は一度計算された後にキャッシュされます。
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;
}
String is immutable であるString
ため、既存のインスタンスを更新することはできません。できることは、新しいインスタンスを作成し、それを同じ変数に割り当てることです。
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;
}
したがって、ハッシュコードはメソッドが呼び出されたときにのみ計算されます
文字列を「更新」することはできません。文字列は不変です。文字列インスタンスを「変更」すると、実際には新しい文字列インスタンスが取得されます。
この質問はまだ「答えられていない」と思います。グーグルで見つけました。したがって、すべての回答を要約し、さらに価値を追加するには:
文字定数で初期化された文字列は常にインターンされます。
public static void main(String[] args) {
String hello1 = "Hello";
String hello2 = "Hello";
System.out.println( hello1 == hello2 );
}
「true」と出力されることを確認できます。hello1 と hello2 の hashCode を呼び出す場合、実際には同じオブジェクトであるため、hashCode は 1 回だけ計算されます。
この情報が、グーグルでそこにたどり着いた人にとって役立つことを願っています。