Сравнение между переменными, указывающими на один и тот же объект Integer - PullRequest
17 голосов
/ 21 июня 2010

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

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

Ответы [ 3 ]

21 голосов
/ 21 июня 2010

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

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

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

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

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

0 голосов
/ 04 июля 2018

Целочисленный объект является неизменным, любое изменение в существующем объекте создаст новый объект. Таким образом, после a++ будет создан новый объект, и a начнет указывать на этот новый объект, в то время как b все еще указывает на старый объект. Следовательно, после a++, a и b указывают на разные объекты и a == b всегда будет возвращать false.

относительно упомянутого примера:

Integer a; //created Integer reference   
Integer b;  //created Integer reference  
a = new Integer(2);//created new Integer Object and a reference is assigned to that new object   
b = a;//b also start pointing to same Integer object   
if(b == a) { // b==a will be true as both are pointing to same object   
System.out.println("Strange");   
}
a++; //after a++ , a new Integer object will be created (due to Integer immutablity and a will point to that new object while b is still pointing to old), so b==a will be false   
if(b == a) { 
System.out.println("Stranger"); 
}   
a--; //again a new Integer Object will be created and now a will start pointing to that new Object , so b==a will be false   
if(b == a) { 
System.out.println("Strangest");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...