Ответ 1
Что артефакт autoboxing и факт, что Integer неизменен в Java.
a++
и a--
переведены примерно так.
int intA = a.getInt( );
intA++;
a = Integer.valueOf( intA ); // this is a reference different from b
Выход текущей программы - "Странно". Но обе переменные имеют одну и ту же ссылку. Почему второе и третье сравнения не соответствуют действительности?
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
Что артефакт autoboxing и факт, что Integer неизменен в Java.
a++
и a--
переведены примерно так.
int intA = a.getInt( );
intA++;
a = Integer.valueOf( intA ); // this is a reference different from b
Strage
- очевидно, что две переменные указывают на один и тот же объект
not Stranger
из-за автобоксинга. Integer
является неизменным, поэтому каждая операция на нем создает новый экземпляр.
not Strangest
из-за предыдущей точки и потому, что вы использовали new Integer(..)
, который игнорирует кеш, который используется для диапазона байтов. Если вы сначала используете Integer.valueOf(2)
, тогда будет использоваться кешированный Integer
, а также будет напечатан Strangest
.