-1
String str="abc";
for (int i = 0; i < 100; i++)
{
  System.out.println(str.hashCode());
}

1)Stringは不変のクラスであり、そのhashCodeはプライベート変数hashにキャッシュされます。

2)文字列strはリテラルであるため、作成されたこの文字列オブジェクトは、permgenスペースのstringpoolに追加されます。したがって、strを参照するときは、同じオブジェクトが得られるはずです。

文字列のhashCodeメソッドでプロセスをデバッグし、str.hashCode()を呼び出すときに上記の2つのポイントに基づいて、ハッシュの計算を1回だけ開始し、次の99回は文字列の「キャッシュされたハッシュプライベート変数」を返す必要があります。物体"。ポイント1ではうまくいきません。この振る舞いについて教えてもらえますか?

これをデバッグすると、hashCodeが100回計算され、hashCode値を出力して、オブジェクトが同じhashCodeを持っているかどうかを確認します。

4

3 に答える 3

1

java.lang.Stringクラスオブジェクトハッシュ値をキャッシュします。ハッシュコードが最初に呼び出されたときにインスタンス変数ハッシュを割り当てます。以下を参照してください。

public int hashCode() {
        int h = hash;
        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;
        }
        return h;
    }

さらにハッシュコードを要求すると、計算をスキップして、ハッシュを介してhが返されます。コードのすぐそこに私はそれを見ることができます!

于 2012-07-24T16:11:27.210 に答える
1

ハッシュコードは1回だけ計算されます。関数の本体を参照してくださいjava.lang.String.hashCode()

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

2回目はstr.hashCode()、変数が0hとは異なり、ステートメントの本体が実行されないことを呼び出しました。if

于 2012-07-24T16:13:10.840 に答える
0

私の悪い。

デバッグを開始したときにhashCodeにブレークポイントがあったため、hashCodeメソッドはforloopによって呼び出されませんが、一部のシステムによって初期静的メソッドがStringhashCodeメソッドを呼び出しています。

管理者は質問を閉じてください

于 2012-07-26T19:04:47.023 に答える