Тест равенства Обертки Java

21
задан roottraveller 20 October 2016 в 09:21
поделиться

5 ответов

В 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

20
ответ дан 17 October 2019 в 01:08
поделиться

В основном Целые числа между-127 и 127 'кэшируются' таким способом, которым при использовании тех чисел, Вы всегда обращаетесь к тому же числу в памяти, которая является почему Ваш == работы.

Любое Целое число за пределами того диапазона не кэшируется, таким образом ссылки не являются тем же.

6
ответ дан 17 October 2019 в 01:08
поделиться

Это относится к равенству и автоупаковке: http://web.archive.org/web/20090220142800/http://davidflanagan.com/2004/02/equality-and-autoboxing.html

4
ответ дан 17 October 2019 в 01:08
поделиться

@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.

Примечание, что это также описывает то, что происходит с другими типами.

5
ответ дан 17 October 2019 в 01:08
поделиться

Ваш код не компилирует. Это - то, что я получаю:

Исключение в потоке "основной" java.lang. Ошибка: Нерешенные проблемы компиляции: Несоответствие типов: не может преобразовать от интервала до несоответствия Целого типа: не может преобразовать от интервала до Целого числа

at WrapperTest.main(WrapperTest.java:5)

, Переменные i и j являются экземплярами Целочисленного объекта. Не сравнивайте использование объектов-экземпляров "==" оператор, использование "равняется" методу вместо этого.

Поздравления

0
ответ дан 17 October 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: