В чем разница между Integer и int в Java?

249

Например, почему вы можете сделать:

int n = 9;

Но нет:

Integer n = 9;

И вы можете сделать:

Integer.parseInt("1");

Но нет:

int.parseInt("1");
Мино
источник
35
целое число является классом, int является примитивным типом
Anycorn
24
Вы можете сделать это Integer n = 9;из-за автобокса (если вы не используете очень старую версию Java)
Alderath

Ответы:

321

intэто примитивный тип. Переменные типа intхранят фактическое двоичное значение для целого числа, которое вы хотите представить. int.parseInt("1")не имеет смысла , потому что intэто не класс и , следовательно , не имеет каких - либо методов.

Integerэто класс, не отличающийся от любого другого языка Java. Переменные типа Integerхранят ссылки на Integerобъекты, как и любой другой ссылочный (объектный) тип. Integer.parseInt("1")это вызов статического метода parseIntиз класса Integer(обратите внимание, что этот метод на самом деле возвращает intа неInteger ).

Чтобы быть более конкретным, Integerэто класс с одним полем типа int. Этот класс используется там, где вам нужно, чтобы intк нему относились, как к любому другому объекту, например, в универсальных типах или в ситуациях, когда вам нужна обнуляемость.

Обратите внимание, что каждый примитивный тип в Java имеет эквивалентный класс- оболочку :

  • byte имеет Byte
  • short имеет Short
  • int имеет Integer
  • long имеет Long
  • boolean имеет Boolean
  • char имеет Character
  • float имеет Float
  • double имеет Double

Классы обертки наследуются от класса Object, а примитивы - нет. Таким образом, он может быть использован в коллекциях со ссылкой на объект или с помощью Generics.

Начиная с Java 5 у нас есть автобокс, и преобразование между примитивом и классом-оберткой выполняется автоматически. Однако будьте осторожны, так как это может привести к незначительным ошибкам и проблемам с производительностью; Быть откровенным о преобразованиях никогда не повредит.

Darkhogg
источник
6
Во C#всех типах данных есть «псевдонимы», и int.Parse()они имеют смысл (хотя на самом деле это не так)
Вахид Амири
22
@ VSG24 ... но это был вопрос Java, и это ответ Java. C#совершенно не имеет значения здесь.
Дархогг
3
Хорошим примером может быть: Ошибка компиляции: List <int> Действительный: List <Integer>
hagai
Дополнительные знания всегда на пользу
Sumit Sharma
1
Мне нравится изучать новые вещи, особенно когда знания связаны с текущей темой. Спасибо Вахид.
Пол Оливер
30

Integer - это класс, а int - это примитивный тип.

Читайте по этим ссылкам:

Матяз Мухич
источник
1
Я хочу отметить, я думаю, что это идеальный ответ по двум причинам: 1- Краткий и точный, с учетом аудитории / спрашивающего 2- Предоставляет направление для дополнительной информации, а не помещает все это в текст ответа Не все На вопросы можно ответить точно и кратко (некоторые требуют гораздо больше подробностей и нюансов, чтобы быть точными и полными), но я думаю, что все ответы должны быть такими простыми и прямыми.
DRich
11
Хех, я думаю, что на самом деле все наоборот. «int - это примитивный тип» ничего вам не говорит, если вы не знаете, что такое примитивный тип. (И если да, то вы, скорее всего, уже знаете разницу между int и Integer). И отправка читателю по двум ссылкам, помеченным как «Ссылка 1» и «Ссылка 2», довольно бесполезна, особенно по сравнению с простым цитированием соответствующих разделов.
Стив Беннетт
7

Integer - это просто оболочка для примитивного типа int. Он позволяет вам использовать все функции класса Integer, чтобы облегчить вам жизнь.

Если вы новичок в Java, вы должны научиться ценить документацию по Java. Например, все, что вы хотите знать о классе Integer, подробно описано в документации.

Это прямо из документации для класса Integer:

Класс Integer оборачивает значение примитивного типа int в объект. Объект типа Integer содержит одно поле, тип которого int.

Надир Музаффар
источник
7
Это несколько упускает из виду. Например, как Integerи класс, он может храниться в контейнерах (в отличие от примитивных типов).
Оливер Чарльзуорт
6

Переменная int содержит 32-разрядное целое число со знаком. Integer (с заглавной I) содержит ссылку на объект (класса) типа Integer или на ноль.

Java автоматически приводит между ними; от Integer до int всякий раз, когда объект Integer встречается в качестве аргумента оператора int или назначается переменной int, или значение int присваивается переменной Integer. Этот кастинг называется бокс / распаковка.

Если целочисленная переменная, ссылающаяся на null, является явной или неявной, без нее, создается исключение NullPointerException.

(В приведенном выше тексте термин «переменная» означает локальную переменную, поле или параметр)

Бартломей Семанчик
источник
5

Integerссылается на тип оболочки в Java, тогда как intявляется примитивным типом. Все, кроме примитивных типов данных в Java, реализовано так же, как объекты, которые подразумевают, что Java является высококвалифицированным чисто объектно-ориентированным языком программирования. Если вам нужно, все типы примитивов также доступны как типы-оболочки в Java. Вы можете получить некоторое преимущество в производительности с примитивными типами, и, следовательно, типы-обертки должны использоваться только тогда, когда это необходимо.

В вашем примере, как показано ниже.

Integer n = 9;

постоянная 9в настоящее время автоматически в штучной упаковке ( auto-boxingи unboxingпроисходит автоматически и java 5далее) , чтобы Integerи , следовательно , вы можете использовать оператор , как это и также Integer n = new Integer(9). Это на самом деле достигается с помощью заявленияInteger.valueOf(9).intValue();

лев
источник
3

int является примитивным типом, а не объектом. Это означает, что нет никаких методов, связанных с этим. Integer - это объект с методами (например, parseInt).

С более новой Java есть функциональность для автоматического бокса (и распаковки). Это означает, что компилятор вставит Integer.valueOf (int) или integer.intValue (), где это необходимо. Это означает, что на самом деле можно написать

Integer n = 9;

который интерпретируется как

Integer n = Integer.valueOf(9);
Роджер Линдсё
источник
3

Integer - это класс-обертка / Object, а int - примитивный тип. Эта разница играет огромную роль, когда вы хотите сохранить значения int в коллекции, потому что они принимают только объекты в качестве значений (до jdk1.4). JDK5 и дальше из-за автобокса это совсем другая история.

коша
источник
5
JDK5 + также принимает только объекты; это просто, что autoboxing позволяет компилятору автоматически вызывать Integer.valueOf(i)или Integer.intValue()для вас. Collection<int>все равно не будет работать. Так что это не совсем другая история - это та же самая история, с небольшим сокращением.
ишавит
согласовано. Извините, моя формулировка может не отражать это.
Коса
3

В Java int является примитивным типом данных, а Integer является классом Helper, он используется для преобразования одного типа данных в другой.

Например:

         double doubleValue = 156.5d;
         Double doubleObject  = new Double(doubleValue);
         Byte myByteValue = doubleObject.byteValue ();
         String myStringValue = doubleObject.toString();

Примитивные типы данных хранят самую быструю доступную память, где класс Helper сложен, и хранятся в динамической памяти.

ссылка от "David Gassner" Java Essential Training.

Акель Хайдер
источник
2

intпримитивный тип, представляющий целое число в то время Integerкак объект, который оборачивает int. IntegerОбъект дает вам больше функций, таких как преобразование в шестнадцатеричном, строки и т.д.

Вы также можете использовать концепции ООП с Integer. Например, вы можете использовать Integer для обобщений (то есть ).Collection<Integer>

РС
источник
2

Это взято из Java: полный справочник, девятое издание

Java использует примитивные типы (также называемые простыми типами), такие как int или double , для хранения основных типов данных, поддерживаемых языком. Примитивные типы , а не объекты, используются для этих количеств ради производительности . Использование объектов для этих значений добавило бы неприемлемые издержки даже для самых простых вычислений. Таким образом, примитивные типы не являются частью иерархии объектов и не наследуют Object .

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

Классы Wrapper напрямую связаны с функцией автобоксинга в Java . Типы обёрток: Double, Float, Long, Integer, Short, Byte, Character и Boolean . Эти классы предлагают широкий спектр методов, которые позволяют вам полностью интегрировать примитивные типы в иерархию объектов Java.

Теоман Шипахи
источник
1

Чтобы оптимизировать время выполнения кода Java, были добавлены int примитивные типы, в том числе floatи boolт. Д., Но они поставляются вместе с классами-обертками, так что при необходимости вы можете конвертировать и использовать их в качестве стандартного объекта Java вместе со многими утилитами, входящими в их состав. функции (такие как Integer.parseInt("1")).

Ананд
источник
1

intявляется примитивным типом данных, в то время как Integerявляется типом ссылки или типа оболочки (класса) в Java.

после java 1.5чего вы можете ввести концепцию автобоксирования и распаковки, вы можете инициализировать оба intили Integerкак это.

int a= 9
Integer a = 9 // both valid After Java 1.5.

почему Integer.parseInt("1");нет int.parseInt("1");??

Integerэто класс, определенный в jdkбиблиотеке, и parseInt()это статический метод принадлежит Integerклассу

Итак, Integer.parseInt("1");возможно в Java. но intпримитивный тип (предположим, как ключевое слово) в Java. Таким образом, вы не можете позвонить parseInt()с int.

Викрант Кашьяп
источник