Вывод текущей программы является "Странным". Но оба переменные совместно используют ту же ссылку. Почему не верны вторые и третьи сравнения?
Integer a;
Integer b;
a = new Integer(2);
b = a;
if(b == a) {
System.out.println("Strange");
}
a++;
if(b == a) {
System.out.println("Stranger");
}
a--;
if(b == a) {
System.out.println("Strangest");
}
Вывод: Strange
Это артефакт автобокса и тот факт, что Integer неизменяем в Java.
a ++
и a -
примерно так переводятся.
int intA = a.getInt( );
intA++;
a = Integer.valueOf( intA ); // this is a reference different from b
Strage
- очевидно, две переменные указывают на один и тот же объект
, а не Stranger
из-за автобокса. Целое число
неизменяемо, поэтому каждая операция над ним создает новый экземпляр.
, а не Самый странный
, из-за предыдущего пункта, и потому что вы использовали новое целое число (..)
, которое игнорирует кеш, который используется для диапазона байтов. Если вы изначально используете Integer.valueOf (2)
, тогда будут использоваться кэшированные Integer
s, а также будет напечатано Strangest
.