2017-02-06 4 views
2

Я нашел это в книге:Java: Integer Неизменность

объектов Integer являются неизменными объектами. Если существует объект Integer для уже существующего значения, он не создает новый объект .

Я попробовал Exemple:

Integer i = 2147483645; 
Integer j=2147483644; 
j++; 

System.out.println("i == j : "+(i==j));; 
System.out.println("i.equals(j) : "+i.equals(j)); 

Я получаю False, True.

Должен ли я получить True, True?

+0

Возможный дубликат [это] (http://stackoverflow.com/questions/3637936/java-integer-equals-vs) –

+9

Ваша книга неточна. Авто-бокс (то есть то, что превращает int-литерал в Integer) требуется только для кэширования значений от -128 до +127 (см. [Jls 5.1.7] (http://docs.oracle.com/javase/specs/ jls/se8/html/jls-5.html # jls-5.1.7)) – yshavit

+1

В Java, «AB» == «AB»; но «AB»! = «A» + «B». –

ответ

4

Должен ли я получить Истину, Истину. ???

нет, вы получите ложным, так как эти объекты не сохраняется в любом целом пуле (более или менее такой же принцип, как струнный-пул), и поэтому я и J указую на совершенно другую ссылку ,

есть возможный случай, когда вы можете получить такое сравнение возвращает истину, и что не для значений до 127 ...

один пример, чтобы убедиться, что это:

Integer b2=128; 
Integer b3=128; 
System.out.println(b2==b3); 

, который будет печатать ложный.

но

Integer b2=127; 
Integer b3=127; 
System.out.println(b2==b3); 

напечатает правда!

+0

Размер кеша Integer может зависеть от JVM и вашей команды как args, поэтому я использую '-129' в примерах, которые никогда не кэшируются. '128' может быть. –

+1

Хорошее наблюдение @PeterLawrey, спасибо ... –

0

Если вы пишете:

Integer i = 2147483645; 
Integer j = 2147483644; 
j++; 

затем создать два независимых объектов в двух местах в памяти. Проверяя их равенство с «==», вы проверяете, совпадает ли место в памяти. И вы получаете ложь, потому что это не так. Используя «equals», вы проверяете, является ли их значение одинаковым, и это так.

0

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