2013-10-06 4 views
3
public class IntegerVsInt { 

    public static void main(String args[]) 
    { 
     int a = 1; 
     int b = 1; 
     int c = a + b; 

     System.out.println(c); 
     System.out.println(a == b); 

     Integer x = 1; 
     Integer y = 1; 
     Integer z = x + y; 

     System.out.println(z); 
     System.out.println(x == y); 
    } 
} 

В приведенном выше коде я сравниваю два int и два объекта типа integer.java: class Integer == operator странное поведение

Если сравнить два, чтобы сравнить INT в

a == b 

Я бы ожидать, что их значения.

Однако, если сравнить два Integer-х

x == y 

я ожидал бы адрес двух сравниваемых объектов, а затем возвращают ложь.

Я вернусь в обоих случаях? Почему это поведение?

ответ

3
x == y 

является true для значений между -128 и 127 из-за целое кэширование.

Попробуйте

Integer x = 130; 
Integer y = 140; 

Теперь сравните и увидеть магию.

От language spec

Если значение р будучи в штучной упаковке является истинным, ложным, байт, или символ в диапазоне \ u0000 к \ u007f, или INT или короткое число в диапазоне от -128 до 127 (включительно), то пусть r1 и r2 - результаты любых двух бокс-преобразований p. Всегда бывает, что r1 == r2.

Причина:

поведение будет искомым, без наложения какого-либо неправомерного потери производительности, особенно на небольших устройствах. Меньше возможностей, ограниченных памятью.

+0

Вы имеете в виду, что '==' было переопределено в этом случае для сравнения целочисленных значений вместо адреса объектов? – liv2hak

+0

Это не значит, что '==' было переопределено для сравнения значений, так что во всех случаях, когда вы создаете новый объект Integer (1), существует только 1 объект, а внутренности возвращают эту ссылку Object, а не создают новый. –

+1

@ liv2hak Нет совсем не понятие '=='. Это концепция кэширования и улучшения языковой производительности. –

6

== Проверяет, являются ли целые объекты одним и тем же объектом. В java необходимо кэшировать некоторые небольшие значения, а также другие могут быть кэшированы, поэтому ссылка == Object ссылается на true.

Фрагмент из JLS Spec 5.1.7

Если значение р будучи в штучной упаковке является истинным, ложным, байт, или символ в диапазоне \ u0000 к \ u007f, или INT или короткое число в диапазоне от -128 до 127 (включительно), то пусть r1 и r2 - результаты любых двух бокс-преобразований p. Всегда бывает, что r1 == r2.

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