5

今日はJava言語を試すのは初めてです。このコードを試すと、非常に奇妙に感じます。

int a =500;
System.out.println(System.identityHashCode(500));
System.out.println(System.identityHashCode(500));
System.out.println(System.identityHashCode(a));
System.out.println(System.identityHashCode(a));

これらの結果はすべて異なります。でも500を50に変えたら同じ結果になりました。

それはなぜです?

4

2 に答える 2

12

でも500を50に変えたら同じ結果になりました。

オートボクシングは、プリミティブからオブジェクトへの変換をキャッシュします。小さな値は同じオブジェクトを取得しますが、大きな値は取得しません。

注: -128 から 127 の間の値は常にキャッシュされますが、コマンド ラインの設定によっては、より高い値をキャッシュすることもできます。詳細については、ソースを参照しIntegerてください。

これは、フライウェイト パターンとも呼ばれます。


整数キャッシュの最大サイズを設定できます

-Djava.lang.Integer.IntegerCache.high=NNNN
-XX:AutoBoxCacheMax=NNNN
-XX:+AggressiveOpts  // sets it higher depending on the version e.g. 10000

http://martykopka.blogspot.co.uk/2010/07/all-about-java-integer-cache.html

http://www.javaspecialists.eu/archive/Issue191.html

とても奇妙に感じます

この質問を読んで何を言いたいのか分かります。;)

于 2012-08-09T11:21:17.150 に答える
4

int値 -128 と 127 (両端を含む) をキャッシュするため、その範囲内のメモリ内の同じインスタンスを参照します。

プリミティブ値を (​​ここで10)に渡す場合

System.identityHashCode(10);

それをIntegerオブジェクトに自動ボックスvalueOf()化し、変換にIntegerクラスのメソッドを使用します

例えば

Integer a = 10;

内部で使用するものに変換されますvalueOf()

1:   invokestatic    #2; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;

Integer.valueOf()キャッシュの実装を持っている

public static Integer valueOf(int i) {
    if(i >= -128 && i <= IntegerCache.high)
        return IntegerCache.cache[i + 128];
    else
        return new Integer(i);
}

したがって、-128 から 127 までの値を渡すと、キャッシュされたバージョンが使用されます。

    if(i >= -128 && i <= IntegerCache.high)
        return IntegerCache.cache[i + 128];

関連項目

于 2012-08-09T11:20:21.423 に答える