Чем int отличается от Integer
int — примитивный тип: переменная хранит само число. Integer — класс-обёртка: объект, внутри которого лежит число. Обёртка есть у каждого примитивного типа:
| Примитив | Обёртка |
|---|---|
int | Integer |
long | Long |
double | Double |
boolean | Boolean |
char | Character |
В обычных расчётах берите int: он быстрее и не бывает null. Integer нужен там, где Java требует объект, — прежде всего в коллекциях.
Коллекции хранят только объекты
ArrayList<int> не скомпилируется: в угловых скобках может стоять только класс. Пишут ArrayList<Integer>, а переход между int и Integer Java делает сама — это автоупаковка (autoboxing) и распаковка (unboxing):
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));
}
}30numbers.add(10) упаковывает int в Integer, int first = numbers.get(0) распаковывает обратно.
Ловушка 1: сравнение через ==
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 — и тогда распаковка падает:
Integer count = null;
int n = count;Вторая строка выбросит NullPointerException. Чаще всего так бывает с HashMap: map.get(key) возвращает null, если ключа нет. Берите map.getOrDefault(key, 0).
Ловушка 3: remove у списка чисел
У List<Integer> два метода remove: по номеру и по значению.
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
Integer.parseInt("42")— строку в число (справка Как перевести строку в число);Integer.MAX_VALUEиInteger.MIN_VALUE— пределыint: 2147483647 и −2147483648;Integer.compare(a, b)— сравнение для сортировки;Integer.toBinaryString(n)— двоичная запись.