двойной выход из косой черты в полном пути, если вы находитесь в окнах.
Нет, постоянный пул для чисел не работает так же, как для строк. Для строк используются только константы времени компиляции, тогда как для типов оберток для целых типов любая операция по боксу будет всегда использовать пул, если он применим для этого значения. Так, например:
int x = 10;
int y = x + 1;
Integer z = y; // Not a compile-time constant!
Integer constant = 11;
System.out.println(z == constant); // true; reference comparison
JLS гарантирует небольшой диапазон объединенных значений, но реализации могут использовать более широкий диапазон, если они пожелают.
Обратите внимание, что, хотя это не гарантируется, каждый Реализация Я рассмотрел использование Integer.valueOf
для выполнения операций бокса - так что вы можете получить тот же эффект без помощи языка:
Integer x = Integer.valueOf(100);
Integer y = Integer.valueOf(100);
System.out.println(x == y); // true
Из раздела 5.1 .7 из JLS :
Если значение p, помещенное в поле, равно true, false, байт или символ в диапазоне от \ u0000 до \ u007f, или int или короткое число от -128 до 127 (включительно), затем пусть r1 и r2 - результаты любых двух бокс-конверсий p. Всегда бывает, что r1 == r2.
В идеале боксирование данного примитивного значения p всегда дает идентичную ссылку. На практике это может оказаться невозможным с использованием существующих методов внедрения. Правила выше - прагматичный компромисс. Последнее заключительное предложение требует, чтобы определенные общие значения всегда помещались в неразличимые объекты. Реализация может кэшировать эти, лениво или нетерпеливо. Для других значений эта формулировка запрещает любые предположения о идентичности вложенных значений на части программиста. Это позволило бы (но не требовать) совместного использования некоторых или всех этих ссылок.
Это гарантирует, что в большинстве распространенных случаев поведение будет желательным, не налагая чрезмерного штрафа за производительность, особенно на небольшие устройства. Менее ограниченные памятью реализации могут, например, кэшировать все значения char и short, а также значения int и long в диапазоне от -32K до + 32K.
Java поддерживает пул Integer с -128
до 127
Объявление целых чисел, как показано ниже
Integer i1 = 127;
Результаты в
Integer i1 = Integer.valueOf(127);
So что на самом деле происходит в первом случае
Integer i1 = 127;<---Integer.valueOf(127);
Integer i2 = 127;<---Integer.valueOf(127);<---Same reference as first
Из исходного кода Integer
для метода класса valueOf
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
Итак, вы получаете такую же ссылку, если значение находится между -128
до 127
, и вы вызываете valueOf
иначе он просто возвращает new Integer(i)
. И поскольку ссылка такая же, ваш оператор ==
работает для целых чисел, возвращаемых valueOf
между этим диапазоном.
Короче говоря, новые версии кеша Java Integer находятся в диапазоне от -128 до 127 (256 значений). смотрите здесь
Java кэширует целые объекты в диапазоне -128 to 127
. Поэтому, когда вы пытаетесь присвоить значение в этом диапазоне объекту wrapper
, операция boxing
вызовет метод Integer.valueOf
и, в свою очередь, назначит ссылку на объект, уже находящийся в пуле.
С другой стороны, если вы присвоите значение вне этого диапазона ссылочному типу wrapper
, Integer.valueOf
создаст для этого значения новый объект Integer
. И, следовательно, сравнение reference
для объектов Integer
, имеющих значение вне этого диапазона, даст вам false
Итак,
Integer i = 127; --> // Equivalent to `Integer.valueOf(127)`
Integer i2 = 127;
// Equivalent to `Integer.valueOf(128)`
// returns `new Integer(128)` for value outside the `Range - [-128, 127]`
Integer i3 = 128;
Integer i4 = 128;
System.out.println(i == i2); // true, reference pointing to same literal
System.out.println(i3 == i4); // false, reference pointing to different objects
Но, когда вы создаете свое целое число экземпляры с использованием оператора new
, новый объект будет создан в куче. Итак,
Integer i = new Integer(127);
Integer i2 = new Integer(127);
System.out.println(i == i2); // false
int
, а не Integer
.
– Jon Skeet
27 October 2012 в 08:26
Integer
на всех четырех местах. Будет ли это редактировать. Спасибо за указание :)
– Rohit Jain
27 October 2012 в 08:27