Java-примитивные типы: int vs. Integer
Я путаюсь, когда использовать Java в примитивных и не примитивных (?) типах (т.е. int vs. Integer). Я понимаю, что в некоторых местах вы не можете использовать примитивные типы (например, при использовании generics). Но как насчет "нормального" кода? Существует ли ограничение производительности для использования не-примитивных типов? Как насчет работы с Android?
*** Мой вопрос очень похож на этот question, который был обнаружен одним из плакатов ниже. Ответы на связанный вопрос дают дополнительную информацию по этому вопросу, которые не рассматриваются ниже.
*** "непримитивные" типы официально называются ссылочными типами.
Ответы
Ответ 1
Короткий ответ: int
- это число; a Integer
- это указатель, который может ссылаться на объект, содержащий число. Использование Integer
для арифметики предполагает большее количество циклов процессора и потребляет больше памяти. int
не является объектом и не может передаваться ни одному методу, который требует объектов (так же, как то, что вы сказали о Generics).
Ответ 2
Непримитивные типы - это объекты. Они должны быть динамически распределены, собраны мусор и проверены на отсутствие (хотя некоторые из этих операций могут быть удалены оптимизирующим компилятором). Для чтения их фактического значения требуется загрузка с указателя. Примитивные типы - это значения. Обычно они занимают меньше места и быстрее доступны.
Хорошим правилом является использование примитивных типов, если вам не нужен полиморфизм, и в этом случае используйте соответствующий объект.
Ответ 3
Существует небольшое ограничение для преобразования между типами (autoboxing). Кроме того, int
будет иметь немного меньше накладных расходов, поэтому я всегда буду с int
, если вы можете.
Также см. этот вопрос: Когда использовать примитивные и ссылочные типы в Java
Ответ 4
Как пурист OO, вы, вероятно, вообще избегаете примитивов и бремя производительности и отсутствия постфиксных операторов. (Да, есть стоимость исполнения.) Вы также можете использовать этот подход просто из соображений расширяемости в качестве дизайнера (не обязательно быть повисшим от чистоты.)
Как практический вопрос (вне теоретических и эстетических вопросов), используйте примитивы везде, где можете, и используйте версию объекта, где вы не можете использовать примитивы. (Вы уже упоминали один такой случай. Язык и API будут принимать это решение.)
Как урод производительности, вы, вероятно, избегаете версий объектов, и вам может не понравиться слишком много, если вы нажмете на несколько золотых правил OO и неприкосновенный отказ: производительность короля, и вы принимаете свои решения соответствующим образом.
Я бы рекомендовал вариант 2 как хорошее место для начала, пока вы не разработали свои собственные догматические предпочтения!:)
Ответ 5
My view: использование Integer в качестве параметров или возвращаемых значений позволяет одну вещь, которую не допускают примитивные ints: Использование null
. Но разве это хорошая идея? Я думаю, что это редко бывает.
Что касается производительности: компилятор в какой-то степени оптимизирует ваш код, поэтому большую часть времени это не представляет реальной проблемы.