Javaで整数値を比較すると奇妙な動作になる 質問する

Javaで整数値を比較すると奇妙な動作になる 質問する

私と一緒に歩きましょう。

Integer x = 23;
Integer y = 23;

if (x == y)
    System.out.println("what else");      // All is well as expected
else
    System.out.println("...");

その間

Integer x = someObject.getIndex();
Integer y = someOtherObject.getSomeOtherIndex();

if (x == y)
    System.out.println("what else");  
else
    System.out.println("...");        // Prints this 

うーん... intにキャストしてみる

int x = someObject.getIndex();
int y = someOtherObject.getSomeOtherIndex()

if (x == y)       
    System.out.println("what else");   // works fine
else
    System.out.println("...");  

両方とも整数ですか?

System.out.println(x.getClass().getName());              // java.lang.Integer
System.out.println(y.getClass().getName());              // java.lang.Integer
System.out.println(someObject.getIndex());               // java.lang.Integer
System.out.println(someOtherObject.getSomeOtherIndex()); // java.lang.Integer

皆さんはどう思いますか? このようなことを説明するものは何でしょうか?

ベストアンサー1

参照である値を比較していますInteger。これらの参照はオートボクシングによって生成されます。一部の値(-128 から 127 までが保証されます)については、JRE はIntegerオブジェクトのキャッシュを維持します。それより大きい値については、そうではありません。JLSのセクション5.1.7:

ボックス化される値 p が true、false、byte、\u0000 から \u007f の範囲の char、または -128 から 127 (両端を含む) の範囲の int または short 数値である場合、r1 と r2 は p の任意の 2 つのボックス化変換の結果となります。常に r1 == r2 となります。

理想的には、特定のプリミティブ値 p をボックス化すると、常に同一の参照が生成されます。実際には、既存の実装手法では実現できない可能性があります。上記のルールは実用的な妥協案です。上記の最後の節では、特定の共通値が常に区別できないオブジェクトにボックス化されることを要求しています。実装では、これらを遅延または積極的にキャッシュできます。他の値については、この定式化により、プログラマー側でボックス化された値の同一性に関する想定ができなくなります。これにより、これらの参照の一部またはすべてを共有できます (必須ではありません)。

これにより、ほとんどの一般的なケースで、特に小型デバイスで過度のパフォーマンスの低下を招くことなく、動作が望ましいものになることが保証されます。メモリ制限の少ない実装では、たとえば、-32K から +32K の範囲のすべての char 値と short 値、および int 値と long 値をキャッシュする場合があります。

Integer教訓:基礎となる値に興味がある場合は、参照を比較しないでくださいint。まず値を使用する.equals()か取得してくださいint

おすすめ記事