Сравнение между переменными, указывающими на тот же Целочисленный объект

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

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

17
задан Kevin Cruijssen 4 April 2016 в 08:15
поделиться

2 ответа

Это артефакт автобокса и тот факт, что Integer неизменяем в Java.

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

int intA = a.getInt( );
intA++;
a = Integer.valueOf( intA ); // this is a reference different from b
21
ответ дан 30 November 2019 в 12:50
поделиться
  • Strage - очевидно, две переменные указывают на один и тот же объект

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

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

7
ответ дан 30 November 2019 в 12:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: