web-dev-qa-db-ja.com

整数キャッシュJava

可能性のある複製:
奇妙なJavaボクシング

最近、Javaコードの次のサンプルがどこにあるかというプレゼンテーションを見ました:

Integer a = 1000, b = 1000;  
System.out.println(a == b); // false  
Integer c = 100, d = 100;  
System.out.println(c == d); // true

今、私は少し混乱しています。最初のケースで結果が「false」になる理由を理解しています。これは、整数が参照型であり、「a」と「b」の参照が異なるためです。

しかし、なぜ2番目のケースで結果が「true」になるのでしょうか。

ある最適化の目的で、JVMが-128から127までのint値のオブジェクトをキャッシュするという意見を聞きました。このように、「c」と「d」の参照は同じです。

誰かがこの動作に関する詳細情報を教えてもらえますか?この最適化の目的を理解したい。どのような場合にパフォーマンスが向上するかなどです。この問題のいくつかの調査への参照は素晴らしいでしょう。

51
Beresta

この最適化の目的を理解したい。どのような場合にパフォーマンスが向上するかなどです。この問題のいくつかの調査への参照は素晴らしいでしょう。

目的は主にメモリを節約することであり、これにより、キャッシュ効率が向上するため、コードの高速化にもつながります。

基本的に、IntegerクラスはIntegerインスタンスのキャッシュを-128から127の範囲で保持し、オートボクシング、リテラル、およびInteger.valueOf()の使用はすべて、そのインスタンスを返しますそれがカバーする範囲のキャッシュ。

これは、これらの小さな値が他の整数よりもはるかに頻繁に発生するという仮定に基づいているため、インスタンスごとに異なるオブジェクトを使用することによるオーバーヘッドを回避することは理にかなっています(Integerオブジェクトは12バイトのようなものを消費します)。

52

Integer.valueOf(int)の実装を見てください。 256より小さい入力に対して同じIntegerオブジェクトを返します。

編集:

以下に示すように、デフォルトでは実際には-128から+127です。

10
dty