Java-примитивные типы: int vs. Integer

Я смущен, когда использовать Java в примитивных или не примитивных (?) Типах (т.е. int vs. Integer). Я понимаю, что в некоторых местах вы не можете использовать примитивные типы (например, при использовании дженериков ). Но как насчет «нормального» кода? Существует ли ограничение производительности при использовании не-примитивных типов? Как насчет работы с Android?

*** Мой вопрос очень похож на этот вопрос , который был обнаружен одним из плакатов ниже. Ответы на связанный вопрос дают дополнительную информацию по этому вопросу, которые не рассматриваются ниже.

*** «непримитивные» типы официально называются ссылочными типами.

Solutions Collecting From Web of "Java-примитивные типы: int vs. Integer"

Короткий ответ: int – это число; Integer – это указатель, который может ссылаться на объект, содержащий число. Использование Integer для арифметики включает в себя больше циклов процессора и потребляет больше памяти. int не является объектом и не может передаваться ни одному методу, который требует объектов (точно так же, как вы говорили об Generics).

Непримитивные типы – это объекты. Они должны быть динамически распределены, сбор мусора и проверены на отсутствие (хотя некоторые из этих операций могут быть удалены оптимизирующим компилятором). Чтение их фактического значения требует загрузки с указателя. Примитивные типы – это значения. Обычно они занимают меньше места и быстрее доступны.

Хорошим правилом является использование примитивных типов, если вам не нужен полиморфизм, и в этом случае используйте соответствующий объект.

Существует небольшое ограничение для преобразования между типами ( автобоксинг ). Кроме того, у int будет немного меньше накладных расходов, поэтому я бы всегда пошел с int если можно.

Также см. Этот вопрос: когда использовать примитив и когда ссылочные типы в Java

Как пурист OO, вы, вероятно, вообще избегаете примитивов и бремя производительности и отсутствия постфиксных операторов. (Да, есть стоимость исполнения.) Вы также можете использовать этот подход просто из соображений расширяемости как конструктора (не обязательно быть зависшим от чистоты).

Как практический вопрос (вне теоретических и эстетических вопросов), используйте примитивы везде, где можете, и используйте версию объекта, где вы не можете использовать примитивы. (Вы уже упоминали один такой случай. Язык и API будут принимать это решение.)

Как урод производительности, вы, вероятно, избегаете версий объектов, и вам может не понравиться слишком глубоко, если вы наберете несколько золотых правил OO и непринужденные действия: производительность короля, и вы принимаете свои решения соответствующим образом.

Я бы рекомендовал вариант 2 как хорошее место для начала, пока вы не разработали свои собственные догматические предпочтения! 🙂

Мое представление: использование Integer в качестве параметров или возвращаемых значений позволяет одно, что примитивные ints не позволяют: использование null . Но это хорошая идея? Я думаю, что это редко бывает.

Что касается производительности: компилятор в какой-то степени оптимизирует ваш код, так что большую часть времени это не проблема.