Чем int отличается от integer java
Перейти к содержимому

Чем int отличается от integer java

  • автор:

Integer и Int разница в чем?

Integer – это обьект (как String ) и, соответственно, ему выделяется больше памяти, чем постоянному типу int . Использую перегрузку методов, метод принимает аргумент Integer а подаю ему int . Может ли возникнуть проблема?

Отслеживать
34k 25 25 золотых знаков 130 130 серебряных знаков 223 223 бронзовых знака
задан 20 ноя 2016 в 13:29
5,658 5 5 золотых знаков 24 24 серебряных знака 56 56 бронзовых знаков

Только не «перезагрузку», а «перегрузку методов». А у вас есть существенные причины использовать Integer вместо int?

20 ноя 2016 в 13:34

У меня нет .Попался в руки Исходник ,там перегрузка методов принимает интеджер а подается ему инт ,немогу понять смысл этого ведь чисто логически ты даешь больше памяти тому что ненужно .

20 ноя 2016 в 13:41

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Integer – это объектный тип, int – это примитивный тип.

Integer – это объектная оболочка над int .

Использую перегрузку методов, метод принимает аргумент Integer, а подаю ему int. Может ли возникнуть проблема?

Если Вы используете перегрузку методов и, например, метод doIt(. ) имеет две сигнатуры:

public void doIt(int i)
public void doIt(Integer i)

то при вызове doIt(5) будет вызван первый метод, а при doIt(new Integer(5)) – второй.

Если же у Вас есть только метод

public void doIt(Integer i)

то при вызове doIt(5) проблем не будет, так как значение 5 автоматически упакуется (autoboxing) в Integer .

Различия между int и Integer в Java: особенности использования

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

Примеры: java int primitiveNum = 42; // Простой и быстрый, не может быть null Integer wrappedNum = new Integer(42); // Представляет собой полноценный объект, допускает null, обладает вспомогательными методами

  • Значение null недоступно.
  • Высокая эффективность по скорости и объему занимаемой памяти.
  • Может содержать в себе null.
  • Доступны дополнительные методы, такие как .equals().

Производительность: сравниваем int и Integer

int превосходит Integer по производительности благодаря своей прямой и простой структуре. Это становится особенно важным при выполнении значительного количества арифметических операций. Однако Integer предоставляет весь спектр возможностей работы с объектами, например, методы compareTo, toString, hashCode. Это может оказаться полезным при манипуляциях с коллекциями или null.

Можно ли применить null: Исследуем вопрос

Класс Integer позволяет присваивать значение null. Это может пригодиться в тех случаях, где данные могут быть необязательными или вовсе отсутствовать. Важно избегать ошибок NullPointerException при распаковке null.

Обобщения и коллекции: Секретное оружие Integer

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

Integer и int

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

Основное различие, разумеется, в том, что Integer — это полнофункциональный объект, который занимает место в куче, а в коде вы пользуетесь ссылками на него, которые неявно преобразуются в значения:

int a = 1000 ; // a — число
Integer b = 1000 ; // b — ссылка на объект

При присваивании значения переменной типа Integer обычно выделяется память в куче под новый объект, как будто вы написали new Integer(1000) (так называемый autoboxing). Однако иногда переиспользуются старые объекты. Это иллюстрирует следующий код (JDK 1.6):

Integer a1 = 50 ;
Integer a2 = 50 ;
Integer b1 = 500 ;
Integer b2 = 500 ;
System. out . println (a1==a2);
System. out . println (b1==b2);

Результатом выполнения будет:

true
false

Здесь фактически вызывается статичный метод java.lang.Integer.valueOf(int), который, как вы можете увидеть в исходниках, кэширует значения от -128 до 127 (в более свежей реализации верхнюю границу кэша можно менять).

Однако в большинстве случаев создаётся новый объект, и это может быть существенно. Помните так же, что объект Integer никогда не меняет своего значения. Рассмотрим такой на первый взгляд невинный код:

public class Increment
public static void main (String[] args)
Integer a= 0 ;
while(true) a++;
>
>

Попрофилируем использование памяти, к примеру, триальной версией JProfiler’а:

Очевидно, при каждом инкременте создаётся новый объект Integer, а старые затем подчищаются сборщиком мусора, когда их накапливается порядка ста тысяч. Неплохая нагрузка на систему для обычной операции инкремента.

В целом понятно, что Integer надо использовать только тогда, когда без него не обойтись. Один из таких примеров — это параметризованные типы (generics), к примеру, стандартные коллекции. Но и тут надо быть аккуратным, чтобы использовать память разумно. Я приведу несколько утрированный пример на основе проблемы, с которой я столкнулся в реальном проекте. В некотором научном анализе требовалось ассоциировать с определёнными объектами длинные множества натуральных чисел. Можно сэмулировать это следующим кодом:

public class MapInteger
static Map> subSets = new HashMap>();

public static void put (Integer key, int value)
if(!subSets. containsKey (key)) subSets. put (key, new HashSet());
subSets. get (key). add (value);
>

public static Collection getRandomKeys ()
List vals = new ArrayList();
for( int i= 0 ; i <( int )(Math. random ()* 500 ); i++)
vals. add (( int )(Math. random ()* 1000 ));
>
return vals;
>

public static void main (String[] args)
new Scanner(System. in ). nextLine ();
for(Integer i= 0 ; i < 100000 ; i++)
for(Integer key: getRandomKeys ())
put (key, i);
>
new Scanner(System. in ). nextLine ();
>
>

Для каждого числа из первых ста тысяч мы определяем набор ключей с помощью getRandomKeys (в реальной задаче ключи, конечно, были неслучайны) и добавляем текущее число в соответствующие множества subSets. Тип ключей Integer выбран для упрощения иллюстрации; в целом он неважен. Вот количества объектов до выполнения операции:

А вот после:

Принудительный запуск сборщика мусора помог несильно:

40 мегабайт памяти съедают целые числа — это печально. Причина кроется в прототипе метода put:
public static void put(Integer key, int value)
Из-за того, что здесь использован тип int, значения переменной i при передаче в метод автоматически преобразуются в int (unboxing), а затем заново в Integer (boxing), но уже создаётся новый объект. Заменим в прототипе int value на Integer value и запустим профайлер заново. В начале картина такая же:

Зато в конце значительные отличия:

И после сборки мусора:

Чем int отличается от integer java

System.out.println(Integer.toString(5, 2)); вот понравилось, просто супер. Берем число, переводим его в обьект стринг и нужную систему исчисления.

Dmitry Уровень 24
15 августа 2023

Всем привет, также проблема при создание обьекта Integer: Integer result=new Integer(15); — не компелируеться; Integer result1=15; — все норм что это за ошибка?

5 августа 2023

Здравствуйте, если создать объект таким образом как указанно в статье начинает ругаться компилятор Integer x = new Integer(25);// Integer(int)’ is deprecated and marked for removal если использовать краткую форму Integer x = 25; то всё норм, почему?

30 мая 2023

 int y=(Integer.parseInt("1100001001",2)); //777 
 int z=(Integer.parseInt("33332",5)); //2342 
 System.out.println(y+"\n"+z); System.out.println(Integer.max(y, z)); 

Vlad Уровень 28
22 октября 2022

 int a = Integer.MAX_VALUE; System.out.println(a*2); 

что будет в результате и почему?
Sergei Kirianov Уровень 27
14 февраля 2022

 Integer inTwo = Integer.parseInt("1100001001",2); Integer inFive=Integer.parseInt("33332",5); System.out.println(inTwo); System.out.println(inFive); System.out.println(Integer.max(inTwo,inFive)); System.out.println(Integer.toString(Math.abs(inFive-inTwo),3)); int max=Integer.MAX_VALUE; String countOfNumber=Integer.toString(max,8); System.out.println(countOfNumber.length()); 

hamster�� Уровень 36
6 ноября 2021

Очень добротная статья, которая помогла мне понять лучше класс Integer =) Однозначно в закладки) Спасибо!

16 июня 2021

 String a = "1100001001"; String b = "33332"; int aIn10 = Integer.parseInt(a,2); int bIn10 = Integer.parseInt(b,5); int max = Integer.max(aIn10,bIn10); int min = Integer.min(aIn10,bIn10); int odds = max - min; System.out.println("Odd within max and min in base 3 is " + Integer.toString(odds,3)); System.out.println(); String maxIntInOctal = Integer.toOctalString(Integer.MAX_VALUE); System.out.println("Integer.MAX_VALUE in octal is " + maxIntInOctal); System.out.println("Count of digits in the Integer.MAX_VALUE in octal is " + maxIntInOctal.length()); 

Вывод: Odd within max and min in base 3 is 2010222 Integer.MAX_VALUE in octal is 17777777777 Count of digits in the Integer.MAX_VALUE in octal is 11 Process finished with exit code 0

Лилия Лебединская Уровень 21
23 марта 2021

еще одна замечательная статья, которая помогает понять, что я делаю)) правда, в моем случае, задачи решить нереально сложно)

Anonymous #2507531 Уровень 11
2 февраля 2021

вторая задача вообще решаема? вылазит исключение For input string: «2341534» under radix 3 то есть я никак не могу перевести результат в троичную систему.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *