1

これは非常に基本的な質問だと思いますが、次のことを理解する方法がわかりません

Object a = 128;
Object b = 128;
Log.debug("a: " + ((Integer) a == (Integer)b));
Log.debug("b: " + (((Integer) a).intValue() == ((Integer) b).intValue()));

a = 127 と b = 127 の場合、両方とも true で、"b" は true で、"a" は false

4

4 に答える 4

7
Object a = 128

にコンパイルされます

Object a = Integer.valueOf(128)

これはオートボクシングと呼ばれます。

一部の JDK バージョンでは、Integer.valueOf() は通常 -128 から 127 までの Integer インスタンスのキャッシュを使用し、毎回新しい Integer インスタンスを作成する代わりに、このキャッシュからインスタンスを返します。その==ため、127 では true が返されますが、128 では返されません。

これは必須ではない実装の詳細であるため、これに依存しないでください。プリミティブな int 値を常に比較するか、 を使用してequals()ください。

于 2013-04-08T14:02:27.577 に答える
5

==演算子は、整数インスタンスのキャッシュされた値に対してのみ機能します。キャッシュされた整数の範囲は -128 から 127 です。ただし、2 番目のケースでは、プリミティブの場合と同じように演算子が機能Integer.intValue()する int プリミティブを返します。==

関連している:

ポストインクリメント後の == の不可解な動作

于 2013-04-08T13:58:56.630 に答える
5

オブジェクト参照を比較している場合、 は、参照が同等のオブジェクトではなく、同じオブジェクトを参照している場合==と定義されます。(そのためです。)trueequals

プリミティブでは、同等の値==として定義されます。true

最初の例では、2 つの異なるオブジェクトがあり、1 つは に割り当てられa、もう1 つは に割り当てられていbます。これは、参照型に割り当てようとしているプリミティブが「自動ボックス化」されている (プリミティブの同等のオブジェクト型に自動的にラップされている) ためです。あなたのコード:

Object a = 128;
Object b = 128;

...効果的には次のように扱われます。

Object a = Integer.valueOf(128);
Object b = Integer.valueOf(128);

...whereは、指定した値をラップInteger.valueOfするオブジェクトを返しますInteger。これは、指定した値に応じて、同じ値を使用した後続の呼び出しで同じオブジェクトになる場合とそうでない場合があります。Javadoc から:

新しいIntegerインスタンスが必要ない場合、このメソッドは、Integer(int)頻繁に要求される値をキャッシュすることにより、スペースと時間のパフォーマンスが大幅に向上する可能性が高いため、通常はコンストラクターよりも優先して使用する必要があります。このメソッドは常に -128 から 127 までの範囲の値をキャッシュしますが、この範囲外の値をキャッシュすることもあります。

これは、値 127 で実行すると、への呼び出しごとに同じオブジェクトが返され、機能したことを意味します。しかし、128 の場合、呼び出しごとに異なるオブジェクトが返されたため、機能しませんでした。これは、2 つの参照が同じオブジェクトを参照しており、同等のものではないことを再度確認するためです。Integer.valueOf====

于 2013-04-08T13:59:02.587 に答える