Глиф Учебники

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

Справочник · Java · 1 минута чтения

int — примитивный тип: переменная хранит само число. Integer — класс-обёртка: объект, внутри которого лежит число. Обёртка есть у каждого примитивного типа:

ПримитивОбёртка
intInteger
longLong
doubleDouble
booleanBoolean
charCharacter

В обычных расчётах берите int: он быстрее и не бывает null. Integer нужен там, где Java требует объект, — прежде всего в коллекциях.

Коллекции хранят только объекты

ArrayList<int> не скомпилируется: в угловых скобках может стоять только класс. Пишут ArrayList<Integer>, а переход между int и Integer Java делает сама — это автоупаковка (autoboxing) и распаковка (unboxing):

Java
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> numbers = new ArrayList<>();
        numbers.add(10);
        numbers.add(20);
        int first = numbers.get(0);
        System.out.println(first + numbers.get(1));
    }
}
Вывод
30

numbers.add(10) упаковывает int в Integer, int first = numbers.get(0) распаковывает обратно.

Ловушка 1: сравнение через ==

Java
public class Main {
    public static void main(String[] args) {
        Integer a = 127;
        Integer b = 127;
        Integer c = 128;
        Integer d = 128;
        System.out.println(a == b);
        System.out.println(c == d);
        System.out.println(c.equals(d));
    }
}
Вывод
true
false
true

== у объектов сравнивает ссылки. Небольшие числа от −128 до 127 Java хранит готовыми объектами и выдаёт один и тот же, поэтому a == b случайно верно. 128 упаковывается в новый объект, и c == d — false. Объекты Integer сравнивайте через equals, а лучше распакуйте в int.

Ловушка 2: null

int всегда содержит число (у поля — 0 по умолчанию). Integer может быть null — и тогда распаковка падает:

Java
Integer count = null;
int n = count;

Вторая строка выбросит NullPointerException. Чаще всего так бывает с HashMap: map.get(key) возвращает null, если ключа нет. Берите map.getOrDefault(key, 0).

Ловушка 3: remove у списка чисел

У List<Integer> два метода remove: по номеру и по значению.

Java
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>(List.of(5, 3, 1, 7));
        list.remove(1);
        System.out.println(list);
        list.remove(Integer.valueOf(1));
        System.out.println(list);
    }
}
Вывод
[5, 1, 7]
[5, 7]

list.remove(1) удалил элемент с номером 1 — тройку, а единица осталась. Чтобы удалить значение, передайте объект: list.remove(Integer.valueOf(1)).

Полезное в классе Integer