Подтвердить что ты не робот

Почему true для некоторых объектов Integer?

Возможный дубликат:
Объекты оболочки Integer имеют одни и те же экземпляры только в пределах значения 127?

Я скопировал следующий фрагмент программы из SCJP Khalid Mughal, но я не могу использовать понять выход.

 public class RQ200_60 {
    public static void main(String[] args) {
        Integer i = -10;
        Integer j = -10;
        System.out.print(i==j);         // output: true -- why true?
        System.out.print(i.equals(j));  // output: true
        Integer n = 128;
        Integer m = 128;
        System.out.print(n==m);         // output: false
        System.out.print(n.equals(m));  // output: true
    }
}      

Вышеприведенная программа дает вывод true для первого оператора печати, но он должен давать false, потому что это сравнение ссылок с оператором == relational. Но третья печать дает ложь, и я не понимаю эту несогласованность.

Пояснения приветствуются!

4b9b3361

Ответ 1

В первом случае оба объекта i и j указывают на тот же кешированный объект. По умолчанию диапазон между -128 и 127 кэшируется как Integer Object. Мы можем увеличить диапазон, используя JVM arguments

Ответ 2

Ответы на кеширование верны. Однако, если вы идете...

Integer i = new Integer(10);
Integer j = new Integer(10);

... тогда вы избегаете кэширования, и результаты будут такими, какие вы ожидали.

Ответ 3

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

== проверяет, являются ли две вещи одним и тем же объектом; вы можете или не можете иметь один и тот же объект Integer для любых двух заданных переменных с одинаковым значением. Вы не должны проверять с помощью ==, потому что вы не должны заботиться, является ли он одним и тем же объектом; значение имеет значение Integer, а не его тождество.

Ответ 4

Здесь в этом случае Integer i и Integer j, удерживающие целочисленные значения, находящиеся в диапазоне от целого, диапазон Integer равен -128 to 128, а Integer n и Integer m превышает диапазон Integer