2010-06-21 5 views
16

Вывод текущей программы «Strange». Но обе переменные имеют одну и ту же ссылку. Почему второе и третье сравнения не соответствуют действительности?Сравнение переменных, указывающих на один и тот же объект 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

+0

Несвобождение, вероятно, является ответом. Однако у меня нет реальной идеи. – jjnguy

+9

+1 для демонстрации непростительного использования автобоксинга. –

ответ

19

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

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

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

Обратите внимание, что если вы замените 'a = новое целое число (2)' на 'a = Integer.valueOf (2)', также будет напечатан «Strangest», поскольку он будет использовать кеш целых для получения экземпляра. –

+0

Что вы подразумеваете под целым кешем в своем комментарии. вы можете уточнить? – restrictedinfinity

+4

@restrictedinfinity. По крайней мере, в Java Sun, Byte, Short и Integer есть кеш с 256 значениями от -128 до 127 включительно, которые обслуживаются методом 'Type.valueOf()'. Итак, в нашем случае после 'a -' значение int равно 2, и это будет то же самое, с которого мы начали, поэтому Integer.valueOf (2) 'вернул бы тот же объект Integer. Обратите внимание, что тип 'Long' не имеет кеша, поэтому' Long.valueOf' всегда возвращает новый объект. –

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

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

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

Смежные вопросы