← Назад ко всем вопросам

Что такое autoboxing/unboxing в Java? Какие подводные камни с Integer?

1️⃣ Как кратко ответить

Autoboxing — это автоматическое преобразование примитивных типов данных в их соответствующие классы-оболочки, например, int в Integer. Unboxing — обратный процесс, преобразование объекта класса-оболочки в примитивный тип. Подводные камни с Integer связаны с кэшированием значений от -128 до 127, что может привести к неожиданным результатам при сравнении объектов с использованием ==.

2️⃣ Подробное объяснение темы

Autoboxing и unboxing — это механизмы в Java, которые упрощают работу с примитивными типами данных и их объектными представлениями. Примитивные типы, такие как int, char, double, не являются объектами и не могут использоваться в коллекциях, которые работают только с объектами. Для этого Java предоставляет классы-оболочки, такие как Integer, Character, Double.

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

Пример autoboxing:

List<Integer> numbers = new ArrayList<>();
int num = 5;
numbers.add(num); // Автоматически преобразуется в Integer.valueOf(num)
  • List<Integer> numbers = new ArrayList<>(); — создается список, который может содержать только объекты типа Integer.
  • int num = 5; — объявляется переменная примитивного типа int.
  • numbers.add(num); — при добавлении int в список происходит autoboxing, и int преобразуется в Integer.

Unboxing — это обратный процесс, когда объект класса-оболочки преобразуется обратно в примитивный тип. Это происходит, например, при выполнении арифметических операций.

Пример unboxing:

Integer numObject = 10;
int num = numObject; // Автоматически преобразуется в numObject.intValue()
  • Integer numObject = 10; — создается объект Integer с значением 10.
  • int num = numObject; — при присваивании объекта Integer переменной int происходит unboxing.

Подводные камни с Integer:

Java кэширует объекты Integer в диапазоне от -128 до 127. Это означает, что при создании объектов Integer в этом диапазоне они могут ссылаться на один и тот же объект в памяти. Это может привести к неожиданным результатам при сравнении объектов с использованием оператора ==, который сравнивает ссылки, а не значения.

Пример:

Integer a = 100;
Integer b = 100;
System.out.println(a == b); // true, так как оба объекта ссылаются на один и тот же кэшированный объект
​
Integer c = 200;
Integer d = 200;
System.out.println(c == d); // false, так как объекты не кэшируются и создаются разные экземпляры
  • Integer a = 100; и Integer b = 100; — оба объекта ссылаются на один и тот же кэшированный объект.
  • System.out.println(a == b); — выводит true, так как ссылки на объекты одинаковы.
  • Integer c = 200; и Integer d = 200; — создаются разные объекты, так как значения выходят за пределы кэшируемого диапазона.
  • System.out.println(c == d); — выводит false, так как ссылки на объекты разные.

Для корректного сравнения значений объектов Integer следует использовать метод equals(), который сравнивает значения объектов, а не их ссылки.

Тема: Java
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки