2016-02-26 4 views
0

У меня есть этот код:В чем разница между этими двумя почти идентичными блоками кода?

int i = 128; 
Integer a = i; 
Integer b = i; 
System.out.println("a==i " + (a == i)); // true 
System.out.println("b==i " + (b == i)); // true 
System.out.println("a==b " + (a == b)); // false 
System.out.println("equals ->" + a.equals(i) 
           + b.equals(i) 
           + a.equals(b)); // true, true, true 

Тогда я изменить свою переменную я быть 127:

int i = 127; 
Integer a = i; 
Integer b = i; 
System.out.println("a==i " + (a == i)); // true 
System.out.println("b==i " + (b == i)); // true 
System.out.println("a==b " + (a == b)); // true !!! look here 
System.out.println("equals ->" + a.equals(i) 
           + b.equals(i) 
           + a.equals(b)); // true, true, true 

Я не понимаю, почему «правда» изменено на «ложь»?

ответ

0

Это память, отведенная

Чтобы сохранить в памяти, Java «повторно» все объекты оболочки, значения падения в следующих диапазонах:

Все логические значения (истинные и ложные)

Все значения Byte

Все символьные значения от \ u0000 до \ u007f (т.е. от 0 до 127 в десятичной системе)

Всех Короткие и Целочисленные значения от -128 до 127.

длинных значений между -128 и 127.

+0

Также 'значения Long' между -128 и 127. –

+0

@PeterLawrey ти для комментария. где я могу найти, что сказано о Лонг. что в Java 7? – Willmore

+0

Javadoc говорит «public static Long valueOf (long l) Возвращает длинный экземпляр, представляющий заданное длинное значение. Если новый длинный экземпляр не требуется, этот метод обычно должен использоваться в предпочтении конструктору Long (long), так как этот метод, вероятно, даст значительно лучшую производительность пространства и времени за счет кэширования часто запрашиваемых значений. Обратите внимание, что в отличие от соответствующего метода в классе Integer * этот метод не требуется для кэширования значений в определенном диапазоне *. " –

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