Здравствуйте, я хотел бы знать, в чем разница между объявлением вектора int[] или объявлением вектора Integer[]. В классном упражнении это было объявлено обоими способами, и я точно не знаю, в чем разница.
JLS говорит, что :
4.2. Примитивные типы и значения
Тип-примитив предопределен языком программирования Java и назван зарезервированным словом (§3.9): (...) Значения-примитивы не имеют общего состояния с другими значениями-примитивами. Числовые типы — это целочисленные типы и типы с плавающей запятой.
Целочисленными типами являются byte, short, int и long, значениями которых являются 8-битные, 16-битные, 32-битные и 64-битные целые числа с дополнением до двух соответственно (...) (§3.1).
Целочисленный Javadoc говорит:
Класс Integer оборачивает примитивный тип int в объект. Объект типа Integer содержит одно поле, значение которого имеет тип int.
И о массивах JLS говорит :
Глава 10. Массивы
В языке программирования Java массивы являются объектами (§4.3.1), создаются динамически и могут быть присвоены переменным типа Object (§4.3.2). Все методы класса Object можно вызывать для массива.
Объект массива содержит ряд переменных. Количество переменных может быть равно нулю, и в этом случае массив называется пустым. Переменные, содержащиеся в массиве, не имеют имен; вместо этого на них ссылаются выражения доступа к массиву, которые используют неотрицательные целые числа в качестве значений индекса. Эти переменные называются компонентами массива. Если массив состоит из n компонентов, мы говорим, что n — это длина массива; компоненты массива ссылаются с помощью целочисленных индексов от 0 до n-1 включительно.
Но это не дает мне понять разницу между int[] и Integer[]
Существенная разница в том, что в JAVA
int
это примитивный тип, а не объект, тогда как этоInteger
объект или класс.На разговорном языке: а
int
— это число, а аInteger
— это указатель, который ссылается на класс, содержащий целое число. Или... еще более разговорно: аInteger
— это коробка, а аint
— то, что находится внутри этой коробки.Что это значит?
A
int
намного быстрее, когда речь идет о вычислении чисел в диапазоне -2 147 483 648 [-2 31 ], то естьInteger.MIN_VALUE
и +2 147 483 647 [2 31 -1], то естьInteger.MAX_VALUE
. Другими словами,int
в нашем распоряжении есть 32 бита информации, которые можно использовать напрямую. См. спецификации .Переменные
int
изменяемы. Если они не отмечены какfinal
, они могут изменить свое значение в любое время. Типичный пример использованияint
для изменения значения счетчика в циклахfor
,while
и т.д.A
Integer
, это объект, который содержит одно полеint
. AInteger
намного громоздче, чемint
. ОбъектыInteger
неизменны. Если вы хотите повлиять на значение переменнойInteger
, единственный способ — создать новый объектInteger
и отказаться от старого.А. Примитив
int
Переменные типа int хранят фактическое двоичное значение целого числа, которое они представляют.
Следовательно, следующий код неверен в Java:
поскольку
int
у него нет методов, его можно объявить только для хранения значения.Б. Класс
Integer
Integer
, как я уже сказал, является классом, как и любой другой класс Java, со своими методами.Этот код правильный в Java:
Это вызов статического метода
parseInt
классаInteger
, который возвращает aint
, а не aInteger
.Можно сказать, что это
Integer
класс с одним полем типаint
. Этот класс используется там, где необходимоint
обращаться с a как с любым другим объектом, например, в универсальных типах или в ситуациях, когда требуются нулевые значения.Когда следует использовать тот или иной?
Вот небольшая таблица с некоторыми показателями:
РЕДАКТИРОВАТЬ: автобоксинг и распаковка
Не все то золото, что блестит, берегитесь!
Поскольку указания предыдущей таблицы были подвергнуты сомнению @LuiggiMendoza в комментариях, я хотел добавить этот раздел, потому что он может распространять ложное представление об использовании автоупаковки и распаковки.
Начиная с Java 1.5 разрешено автоматически преобразовывать примитивы в объекты (обертки) или наоборот. Это известно как AutoBoxing и UnBoxing.
Многое из того, что следует далее, взято из документации по Java :
А. Автобокс
Автоупаковка — это автоматическое преобразование, которое компилятор Java выполняет между примитивными типами и соответствующими классами контейнеров объектов. Например, преобразовать a
int
в aInteger
, adouble
в aDuoble
и так далее. Если преобразование выполняется другим способом, оно называется распаковкой.Компилятор Java применяет автоупаковку, когда примитивное значение:
Вот простейший пример автобокса:
В остальных примерах в этом разделе используются дженерики...
Рассмотрим следующий код:
Хотя
li
значения добавляютсяint
как примитивные типы, а не объекты Integer, код компилируется. Потомуli
что это список объектовInteger
, а не список значенийint
. Можно задаться вопросом, почему компилятор Java не выдает ошибку во время компиляции . Компилятор не генерирует ошибку, потому что он создает объектInteger
изi
и добавляет объект вli
. Поэтому компилятор преобразует приведенный выше код в следующий во время выполнения:Некоторые считают автобоксинг — распаковку чем-то волшебным, чем-то великим. Лично я думаю, что это не так. И здесь стоит спросить, а зачем делегировать компилятору то, что может сделать программист? Будьте осторожны, потому что у нас может быть красивый код, приятный для чтения, но в нем в любой момент может быть серьезный баг.
Этого было бы достаточно, но... вдобавок ко всему, неуместное использование автоупаковки-распаковки имело бы потери производительности, которые могут быть незначительными для небольших операций, но могут быть следствием ошибки в выполнении программы без учета операций. которые должны обрабатывать большие объемы данных или на устройствах с небольшим объемом памяти.
Об этом, между прочим, четко сказано в документации по Java :
B.Распаковка
Преобразование объекта из типа контейнера (
Integer
) в его соответствующее примитивное значение (int
) называется распаковкой.Компилятор Java применяет распаковку, когда объект класса-оболочки:
Рассмотрим следующий метод:
Поскольку операторы (%) и (+ =) не применяются к объектам
Integer
, может возникнуть вопрос, почему компилятор Java компилирует метод без выдачи ошибки. Компилятор не выдает ошибку, потому что он вызывает метод intValue для преобразования aInteger
в aint
во время выполнения :Согласно Java, это вопрос эстетики , а не производительности:
Вот почему Java говорит:
(*) Неисправность импеданса (несоответствие импеданса). Чтобы понять эту концепцию, я приведу пример: если мы ожидаем значения из столбца базы данных, допускающего нули, и присваиваем это значение переменной типа,
int
мы сталкиваемся со случаем,impedance mismatch
посколькуint
это не так . допустим нули, программа могла выдать ошибку , или максимум присвоит значение0
вместоNULL
. Или наоборот, если мы отправляем значения из Java в БД, если мы используемint
для INSERT или UPDATE в БД, мы могли бы отправлять значение в некоторые столбцы вместоNULL
значения0
. Это может показаться глупым , но в некоторых случаях может быть чем-то очень серьезным.И давай промолчим, если придется сравнивать . У нас могут быть неожиданные результаты, поскольку автоупаковка-распаковка маскирует реальные значения, потому что a никогда
Integer
не заменит aint
. Одно дело коробка, а другое то, что внутри коробки. Если мы путаем эти две вещи, мы можем совершить очень серьезные ошибки.Есть и другие причины, по которым нехорошо заставлять Java делать то, что нужно делать. Но это было бы слишком далеко...
Следует отметить, что в Java каждый примитивный тип имеет эквивалентный класс-оболочку:
byte
имеютbyte
short
имеютShort
int
имеютInteger
long
имеютLong
boolean
имеютBoolean
char
имеютChar
float
имеютFloat
double
имеютDouble
Сначала вы должны различать, что такое примитивный тип и объект.
Объект содержит атрибуты и методы. Эти атрибуты могут быть либо объектами, либо примитивными типами.
Объекту может быть присвоено значение null, например:
Integer numero = null;
Тип-примитив не содержит ни атрибутов, ни методов и представляет собой минимальную единицу выражения.
Вы не можете присвоить null примитивному типу, например: (ошибка компиляции)
int numero = null;
В вашем случае int — это примитивный тип, а Integer — это объект, который его представляет.