Что такое 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(), который сравнивает значения объектов, а не их ссылки.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться