Сравнение переменных, указывающих на один и тот же объект Integer

Выход текущей программы - "Странно". Но обе переменные имеют одну и ту же ссылку. Почему второе и третье сравнения не соответствуют действительности?

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

Ответ 1

Что артефакт autoboxing и факт, что Integer неизменен в Java.

a++ и a-- переведены примерно так.

int intA = a.getInt( );
intA++;
a = Integer.valueOf( intA ); // this is a reference different from b

Ответ 2

  • Strage - очевидно, что две переменные указывают на один и тот же объект

  • not Stranger из-за автобоксинга. Integer является неизменным, поэтому каждая операция на нем создает новый экземпляр.

  • not Strangest из-за предыдущей точки и потому, что вы использовали new Integer(..), который игнорирует кеш, который используется для диапазона байтов. Если вы сначала используете Integer.valueOf(2), тогда будет использоваться кешированный Integer, а также будет напечатан Strangest.