В Java Целые числа между-128 и 127 (содержащий) обычно представлены тем же Целочисленным экземпляром объекта. Это обрабатывается при помощи внутреннего класса под названием IntegerCache (содержавший в Целочисленном классе, и использовал, например, когда Integer.valueOf () называют, или во время автоупаковки):
private static class IntegerCache {
private IntegerCache(){}
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
}
}
См. также: http://www.owasp.org/index.php/Java_gotchas
В основном Целые числа между-127 и 127 'кэшируются' таким способом, которым при использовании тех чисел, Вы всегда обращаетесь к тому же числу в памяти, которая является почему Ваш ==
работы.
Любое Целое число за пределами того диапазона не кэшируется, таким образом ссылки не являются тем же.
Это относится к равенству и автоупаковке: http://web.archive.org/web/20090220142800/http://davidflanagan.com/2004/02/equality-and-autoboxing.html
@tunaranch корректен. Это - также та же проблема как в этом вопрос о Python . Суть - то, что Java имеет в наличии объект для целых чисел от-128 до 127 (Python делает-5 к 256), и возвращает тот же объект каждый раз, когда Вы просите одного. Если Вы попросите Целое число за пределами этого фиксированного диапазона, то это даст Вам новый объект каждый раз.
(Вспоминают, что ==
возвраты, являются ли два объекта на самом деле то же, в то время как equals
сравнивает их содержание.)
Редактирование : вот соответствующий абзац от Раздел 5.1.7 из Спецификация языка Java:
, Если значение упаковываемый p
true
,false
,byte
,char
в диапазоне\u0000
к\u007f
, или международное или короткое число между-128 и 127, то позволен r1 и r2 быть результатами каких-либо двух преобразований упаковки p. Всегда имеет место что r1 == r2.
Примечание, что это также описывает то, что происходит с другими типами.
Ваш код не компилирует. Это - то, что я получаю:
Исключение в потоке "основной" java.lang. Ошибка: Нерешенные проблемы компиляции: Несоответствие типов: не может преобразовать от интервала до несоответствия Целого типа: не может преобразовать от интервала до Целого числа
at WrapperTest.main(WrapperTest.java:5)
, Переменные i и j являются экземплярами Целочисленного объекта. Не сравнивайте использование объектов-экземпляров "==" оператор, использование "равняется" методу вместо этого.
Поздравления