![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
Temdegon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 429 Регистрация: 11.10.2008 Где: Minsk Репутация: 7 Всего: 9 |
Наткнулся на статью на Хабре
http://habrahabr.ru/blogs/java/104231/ про различия Integer и int , и про autoboxing. В целом различия понятны, но я над ними никогда особо не задумывасля. Некоторые моменты показались мне не очевидными, по этому решил поделиться этим линком с вами. |
|||
|
||||
Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Спасибо, статья интересная.
-------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
_Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 5 Всего: 34 |
Интересно. Я этого не знал. Может кто-нибудь подскажет зачем это, собственно, нужно? -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Собственно это реализация пула объектов в пределах диапазона byte. Удобно сравнивать указатели без вызова equals() и некоторая экономия памяти достигается за счет отсутствия дубликатов объектов. Этот механизм в некотором роде аналогичен интернированию строк. -------------------- Opinions are like assholes — everybody has one |
|||
|
||||
_Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 5 Всего: 34 |
Честно говоря, понятнее не стало. Понятно, что -128 - 127 это byte, но разное поведение обьектов одного класса в зависимости от присвоенного значения.... Вах-вах какая красивая язык - и так испортить! И, кстати, equals как раз сравнивает значения (ИМХО). А вот как в этом случае (-128 до 127) сравнить сами указатели? -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
jk1 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Не самое очевидное решение, согласен. Обусловлено это скорее всего относительной частотой использования небольших по модулю констант.
Вы меня не так поняли, перефразирую: "Нет необходимости вызывать equals для определения очевидного отношения равенства, можно выполнить сравнение указателей оператором ==. Из-за пулинга сравнение указателей равнозначно вызову equals(). Очевидно сравнение указателей происходит быстрее." -------------------- Opinions are like assholes — everybody has one |
||||
|
|||||
_Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 5 Всего: 34 |
jk1, понятно. Спасибо.
Но вообще опасное это дело. Теперь ночами буду просыпаться, видя в кошмарах как Integer объекту присваивается значение меньше 128 ![]() Кстати, в той статье автор горовил об Integer вроде как "например". Как быть в этом случае с другими подобными классами? -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
Temdegon |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 429 Регистрация: 11.10.2008 Где: Minsk Репутация: 7 Всего: 9 |
Мне все-таки кажется, что пул сделали для экономии памяти, ну и возможно, экономии времени на создание экземпляров. А возможность сравнения через == для byte это сайдэффект такой оптимизации, как и со String. И нефиг об этом задумываться. Правило четкое - обьекты сравнивать через equals! В JavaDoc к Integer тоже не написано, что можно сравнивать через ==.
Честно говоря, слабо представляю себе пример кода, где можно использовать такую оптимизацию. С одной стороны, если у вас есть константа, со значением 100, то вроде как можно юзать ==. Но с другой стороны, константы для того и выносят, чтоб удобно было потом ее поменять в одном месте. Было 100, станет 1000, и лазить по коду и выяснять, как вы там ее сравнивали, никто не будет. Да и вообще, если вы так уверены, что ваша константа будет ВСЕГДА попадать в byte, то почему вы объявили ее как Integer, а не как Byte? С equals vs == для двух враперов мне вроде все понятно. Я про unboxing задумался: вот есть прекрасный метод:
все работает как задумано, проблем я не вижу. Потом читанул я статью на хабре, ну и решил, что мне надо бы тут параметр метода на Integer поменять. Или кто-то в интерфейсе поменял, и срефакторил побыстрому - int, Integer - какая нафиг разница. А в результате epic fail...
Вот это ты правильно заметил. На хабре так чуть ли не холи вар в комментариях устроили, как в джава все херово и как дальше жить. А пор другие враперы никто и не спросил... |
||||||
|
|||||||
_Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 5 Всего: 34 |
Temdegon, ты прав, конечно. Сравнивать значения обьектов через == странновато.
Но == можно использовать для сравнения указателей: на тот же обьект показывает или на другой (пусть и идентичный первому по состоянию своих атрибутов). Впрочем, не могу вообразить, так сразу, подобную надобу в плане Integer. -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
Старовъръ |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.5.2008 Репутация: 4 Всего: 10 |
По этой же причине (вызова метода valueOf()) и будет выброшен NPE, если в коде будет:
Кстати, если вернуться к кешу Integer'ов, то его можно конфигурировать (задавать верхнюю границу) с помощью флага -XX:AutoBoxCacheMax=6132 во время запуска приложения.
Это сообщение отредактировал(а) Старовъръ - 25.3.2011, 20:42 -------------------- |
||||||||||
|
|||||||||||
_Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 5 Всего: 34 |
Старовъръ, кошмар какой!
Ну что поделать - планида значит наша такая ![]() ____________________________________________ Вообще же - хорошо что обратили на это внимание. Это сообщение отредактировал(а) _Y_ - 26.3.2011, 12:18 -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
Старовъръ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.5.2008 Репутация: 4 Всего: 10 |
Если интересно, вот, решил написать небольшую статейку по теме (там еще в конце есть ссылка на другую статью, обязательно прочтите!).
Это сообщение отредактировал(а) Старовъръ - 27.3.2011, 10:25 -------------------- |
|||
|
||||
_Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 5 Всего: 34 |
Старовъръ, интересно и полезно. Единственно, во второй статье большие блоки кода без комментариев - читать весьма напряжно.
-------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |