Оператор Unboxing Autoboxing (! =) И (==)

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 для этого:

различные объекты
значимо равный

Где

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:

тот же объект
значимо равный

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

Ответ 1

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

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

Подробнее см. JLS.

Ответ 2

Существует массив Integer для чисел от -128 to 127 в java. JLS говорит

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

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

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

Ответ 3

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

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

Ответ 4

Целое кэшируется между диапазонами от -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" сравнивает контент. более подробно Вы можете перейти к Неизменяемые объекты/кэширование класса Wrapper

Ответ 5

в любом случае вы можете получить double false с помощью:

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.
   */