0

みんな、この新しい性質と整数の使用について誰でも説明できます

Integer i = new Integer(-10);
Integer j = new Integer(-10);
Integer k = -10;
Integer l=-10;
System.out.println(i==j);
System.out.println(k==l);

答えは偽真です

    Integer a=128;
    Integer b=128;
    Integer c=127;
    Integer d=127;
    System.out.println(a==b);
    System.out.println(c==d);

答えは間違っています。誰でもこの性質を説明できますか。前もって感謝します :)

4

1 に答える 1

2

最初の例では、常に新しいオブジェクトを作成し、それらの参照をとIntegerに割り当てています。オートボクシングを使用している場合は、新しいオブジェクトが作成されることもあれば、作成されないこともあります。ijkl

2番目の例では、オートボクシングを使用しています、値が異なります。これは、上から「時々」を示しています。

JLSのセクション5.1.7から:

ボックス化されている値pがtrue、false、1バイト、または\u0000から\u007fの範囲のchar、または-128から127(両端を含む)のintまたはshortの数値の場合、r1とr2を次の結果とします。 pの任意の2つのボクシング変換。r1==r2の場合は常にそうです。

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

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

于 2012-07-31T08:31:07.820 に答える