オブジェクト参照を比較している場合、 は、参照が同等のオブジェクトではなく、同じオブジェクトを参照している場合==
と定義されます。(そのためです。)true
equals
プリミティブでは、同等の値==
として定義されます。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
==
==