| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Integer и int |
| Автор: Temdegon 19.3.2011, 19:16 |
| Наткнулся на статью на Хабре http://habrahabr.ru/blogs/java/104231/ про различия Integer и int , и про autoboxing. В целом различия понятны, но я над ними никогда особо не задумывасля. Некоторые моменты показались мне не очевидными, по этому решил поделиться этим линком с вами. |
| Автор: Pawl 19.3.2011, 20:26 |
| Спасибо, статья интересная. |
| Автор: _Y_ 23.3.2011, 12:23 | ||
Интересно. Я этого не знал. Может кто-нибудь подскажет зачем это, собственно, нужно? |
| Автор: jk1 23.3.2011, 13:08 | ||
Собственно это реализация пула объектов в пределах диапазона byte. Удобно сравнивать указатели без вызова equals() и некоторая экономия памяти достигается за счет отсутствия дубликатов объектов. Этот механизм в некотором роде аналогичен интернированию строк. |
| Автор: _Y_ 23.3.2011, 15:16 | ||
Честно говоря, понятнее не стало. Понятно, что -128 - 127 это byte, но разное поведение обьектов одного класса в зависимости от присвоенного значения.... Вах-вах какая красивая язык - и так испортить! И, кстати, equals как раз сравнивает значения (ИМХО). А вот как в этом случае (-128 до 127) сравнить сами указатели? |
| Автор: jk1 23.3.2011, 15:21 | ||||
Не самое очевидное решение, согласен. Обусловлено это скорее всего относительной частотой использования небольших по модулю констант.
Вы меня не так поняли, перефразирую: "Нет необходимости вызывать equals для определения очевидного отношения равенства, можно выполнить сравнение указателей оператором ==. Из-за пулинга сравнение указателей равнозначно вызову equals(). Очевидно сравнение указателей происходит быстрее." |
| Автор: _Y_ 23.3.2011, 23:32 |
| jk1, понятно. Спасибо. Но вообще опасное это дело. Теперь ночами буду просыпаться, видя в кошмарах как Integer объекту присваивается значение меньше 128 Кстати, в той статье автор горовил об Integer вроде как "например". Как быть в этом случае с другими подобными классами? |
| Автор: Temdegon 24.3.2011, 04:15 | ||||||
Мне все-таки кажется, что пул сделали для экономии памяти, ну и возможно, экономии времени на создание экземпляров. А возможность сравнения через == для byte это сайдэффект такой оптимизации, как и со String. И нефиг об этом задумываться. Правило четкое - обьекты сравнивать через equals! В JavaDoc к Integer тоже не написано, что можно сравнивать через ==.
Честно говоря, слабо представляю себе пример кода, где можно использовать такую оптимизацию. С одной стороны, если у вас есть константа, со значением 100, то вроде как можно юзать ==. Но с другой стороны, константы для того и выносят, чтоб удобно было потом ее поменять в одном месте. Было 100, станет 1000, и лазить по коду и выяснять, как вы там ее сравнивали, никто не будет. Да и вообще, если вы так уверены, что ваша константа будет ВСЕГДА попадать в byte, то почему вы объявили ее как Integer, а не как Byte? С equals vs == для двух враперов мне вроде все понятно. Я про unboxing задумался: вот есть прекрасный метод:
все работает как задумано, проблем я не вижу. Потом читанул я статью на хабре, ну и решил, что мне надо бы тут параметр метода на Integer поменять. Или кто-то в интерфейсе поменял, и срефакторил побыстрому - int, Integer - какая нафиг разница. А в результате epic fail...
Вот это ты правильно заметил. На хабре так чуть ли не холи вар в комментариях устроили, как в джава все херово и как дальше жить. А пор другие враперы никто и не спросил... |
| Автор: _Y_ 24.3.2011, 15:36 |
| Temdegon, ты прав, конечно. Сравнивать значения обьектов через == странновато. Но == можно использовать для сравнения указателей: на тот же обьект показывает или на другой (пусть и идентичный первому по состоянию своих атрибутов). Впрочем, не могу вообразить, так сразу, подобную надобу в плане Integer. |
| Автор: Старовъръ 25.3.2011, 20:36 | ||||||||||
По этой же причине (вызова метода valueOf()) и будет выброшен NPE, если в коде будет:
Кстати, если вернуться к кешу Integer'ов, то его можно конфигурировать (задавать верхнюю границу) с помощью флага -XX:AutoBoxCacheMax=6132 во время запуска приложения.
|
| Автор: _Y_ 26.3.2011, 12:17 |
| Старовъръ, кошмар какой! Ну что поделать - планида значит наша такая ____________________________________________ Вообще же - хорошо что обратили на это внимание. |
| Автор: Старовъръ 26.3.2011, 23:20 |
| Если интересно, http://www.javatalks.ru/sutra110519.php#110519, решил написать небольшую статейку по теме (там еще в конце есть ссылка на другую статью, обязательно прочтите!). |
| Автор: _Y_ 27.3.2011, 10:41 |
| Старовъръ, интересно и полезно. Единственно, во второй статье большие блоки кода без комментариев - читать весьма напряжно. |