Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Проблемы с автобоксингом


Автор: Се ля ви 7.2.2013, 10:51
Код
Integer x = 120,
                    y = 120;
            System.out.println(x == y); // true

WTF?

Зато, если выходим за диапазон типа "byte":
Код
Integer x = 128,
                    y = 128;
            System.out.println(x == y); //false


По крайней мере в последней, 7-й Java такая штука наблюдается (в более ранних не тестировал).

Кто-нибудь может объяснить - почему такое происходит?

Автор: danilych 7.2.2013, 11:14
Происходит так потому, что числа до 128 типа Integer java машина кеширует. Этот параметр можно и увеличить (вроде как вот этот флаг XX:+EliminateAutoBox). Т.е. если вы в коде задаете числа типа Integer до 128, то объекты класса Integer не создаются, а берутся из кэша JVM, соответственно и переменные ссылаются на одну и ту же область памяти. Если в кэше нет нужного объекта, то он создается (в вашем случае один для y, а другой для x)

Автор: Kircul 7.2.2013, 12:10
Autoboxing это посути ничто иное как вызов метода http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#valueOf(int). Заглянуть в исходный кода думаю проблемы не составит ;)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)