Ответ 1
В первом случае оба объекта i
и j
указывают на тот же кешированный объект. По умолчанию диапазон между -128 и 127 кэшируется как Integer
Object. Мы можем увеличить диапазон, используя JVM arguments
Возможный дубликат:
Объекты оболочки 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. Но третья печать дает ложь, и я не понимаю эту несогласованность.
Пояснения приветствуются!
В первом случае оба объекта i
и j
указывают на тот же кешированный объект. По умолчанию диапазон между -128 и 127 кэшируется как Integer
Object. Мы можем увеличить диапазон, используя JVM arguments
Ответы на кеширование верны. Однако, если вы идете...
Integer i = new Integer(10);
Integer j = new Integer(10);
... тогда вы избегаете кэширования, и результаты будут такими, какие вы ожидали.
Целые объекты могут кэшироваться для тех, которые представляют значение, близкое к 0. (Спецификация для реализации может рассказать вам некоторые детали). Это, по-видимому, для экономии памяти (значения, близкие к 0, являются общими, и это будет тратить много памяти, чтобы создать новый объект для каждой переменной с тем же значением).
==
проверяет, являются ли две вещи одним и тем же объектом; вы можете или не можете иметь один и тот же объект Integer для любых двух заданных переменных с одинаковым значением. Вы не должны проверять с помощью ==
, потому что вы не должны заботиться, является ли он одним и тем же объектом; значение имеет значение Integer
, а не его тождество.
Здесь в этом случае Integer i
и Integer j
, удерживающие целочисленные значения, находящиеся в диапазоне от целого, диапазон Integer
равен -128 to 128
, а Integer n
и Integer m
превышает диапазон Integer