次のスニペットを検討してください。
int i = 99999999;
byte b = 99;
short s = 9999;
Integer ii = Integer.valueOf(9); // should be within cache
System.out.println(new Integer(i) == i); // "true"
System.out.println(new Integer(b) == b); // "true"
System.out.println(new Integer(s) == s); // "true"
System.out.println(new Integer(ii) == ii); // "false"
最後の行が常に出力される理由は明らかです。参照同一性比較"false"
を使用しており、オブジェクトが既存のオブジェクトになることは決してありません。==
new
==
問題は最初の 3 行についてです。これらの比較は、自動アンボックス化されたプリミティブ上にあることが保証されていますか? 代わりにプリミティブが自動ボックス化され、参照同一性比較が実行される場合はありますか? (それはすべてです!)int
Integer
false