2013-12-26 7 views
10
public class T1 {  

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     Integer i1 = 1000; 
     Integer i2 = 1000; 
     if(i1 != i2) System.out.println("different objects"); 
     if(i1.equals(i2)) System.out.println("meaningfully equal");  

    } 

} 

O/P для этого является:Autoboxing распаковка Оператор (=!) И разность (==)

различных объектов
по значению равна

Где, как

public class T2 {  

    public static void main(String[] args) {    

     Integer i3 = 10; 
     Integer i4 = 10; 
     if(i3!=i4)System.out.println("Crap dude!!"); 
     if(i3 == i4) System.out.println("same object"); 

     if(i3.equals(i4)) System.out.println("meaningfully equal");  
    } 

} 

Производит следующие O/P:

же объект
по значению равно

Я не понимаю, почему в классе T2if(i3!=i4) не получил вызвал я ссылаюсь SCJP 1.6, но не в состоянии понять.
Пожалуйста, помогите мне.

+1

Обратите внимание, что вы использовали «1000» в первом примере и «10» во втором примере. – kennytm

+1

Подробнее о диапазоне кеша для целых чисел в Java. Прочитайте Javadoc, исходный код, ... класса оболочки Integer. –

+0

Хорошо .. спасибо Кенни и Рохит. –

ответ

10

Это потому, что 10 находится между диапазоном [-128, 127]. Для этого диапазона == работает отлично, так как JVM кэширует значения, и сравнение будет выполнено на том же объекте.

Каждый раз, когда объект Integer (объект) создается со значением в этом диапазоне, тот же объект будет возвращен вместо создания нового объекта.

Дополнительную информацию см. На сайте JLS.

+0

Получил это человек Спасибо. :) –

+1

** Это может быть неправильно **, поскольку 'Integer.valueOf' выполняет кэширование, конструктор не может. Компилятор внутренне компилирует 'Integer i = 0;' в 'Integer i = Integer.valueOf (0);', поэтому это работает в этом случае. – tilpner

4

Существует целочисленный пул для чисел от -128 to 127 в java. JLS говорит

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

В идеале бокс данного примитивного значения p всегда будет давать идентичную ссылку . На практике это может оказаться невозможным с использованием существующих методов внедрения . Правила выше - прагматичный компромисс . Последнее заключительное предложение требует, чтобы определенные общие значения всегда были помещены в неотличимые объекты. Реализация может кэшировать эти, лениво или нетерпеливо. Для других значений эта формулировка запрещает любые предположения об идентичности вставных значений на части программиста. Это позволило бы (но не требовать) совместного использования некоторых или всех этих ссылок.

Это гарантирует, что в большинстве случаев поведение будет желательным, не налагая чрезмерного штрафа за производительность, особенно на небольшие устройства. Менее ограниченные памятью реализации могут, например, для , кэшировать все значения char и short, а также значения int и long в диапазоне от -32K до + 32K.

4

Маленькие целые числа получают интернированный, что означает, что для данного значения существует только один экземпляр Integer.

Это не происходит для больших целых чисел, следовательно, разница в поведении между вашими двумя тестами.

+0

, поэтому, если мы создаем два объекта Integer внутри [-128 до 127] с таким же значением, тогда будет создан только один объект с этим значением, и оба ссылочных переменных будут указывать на этот объект. Я прав? –

2

Целое кэшируются между диапазоне от -128 до 127. так целое число в диапазоне между (содержащий граничные значения) будет возвращать ту же ссылку ..

как

Integer i3 = 127; 
Integer i4 = 127; 
Integer i5 = 128; 

if(i3!=i4)System.out.println("Crap dude!!"); // same reference 
if(i3 == i4) System.out.println("same object"); 
if(i3 != i5) System.out.println("different object"); 

выход ..

same object 
different object 

В качестве '==' сравнивается ссылка и 'equals' сравнивает контент. более подробно Вы можете перейти к Immutable Objects/Wrapper Class Caching

+2

Я думаю, что выход должен быть Crap dude !! другой объект. –

+0

Возможно, у вас ошибка с ошибкой 1 (i4). Возможно, вы указали 127? – tilpner

+0

@SaurabhSharma, выход чудака такой же, как написано выше .. –

2

в любом случае вы можете получить двухподвальные с:

Integer n1 = -1000; 
Integer n2 = -1000; 

Integer p1 = 1000; 
Integer p2 = 1000; 

System.out.println(n1 == n2); 
System.out.println(p1 != p2); 

есть возможность установить максимальный размер этого Integer пула

/** 
    * Cache to support the object identity semantics of autoboxing for values between 
    * -128 and 127 (inclusive) as required by JLS. 
    * 
    * The cache is initialized on first usage. The size of the cache 
    * may be controlled by the -XX:AutoBoxCacheMax=<size> option. 
    * During VM initialization, java.lang.Integer.IntegerCache.high property 
    * may be set and saved in the private system properties in the 
    * sun.misc.VM class. 
    */ 
Смежные вопросы