Введение в Autoboxing и Unboxing в Java

Автобокс - это автоматическое преобразование, которое Java-компилятор выполняет между примитивными типами и их соответствующими классами-обертками объектов, т.е. преобразование из int в Integer, double в Double и т. Д. Распаковка - это автоматическое преобразование из объектов класса-оболочки в их эквивалентные примитивы, т. Е. Integer в int и т. д. Эта функция была введена в версии 1.5 java, autoboxing и unboxing, так как это автоматические процессы, обрабатываемые JRE, наиболее важным моментом здесь является написание правильного кода, который не добавляет чрезмерных ненужных объектов на рисунке.

Теперь давайте обсудим, как Autoboxing и Unboxing в Java идут внутренне -

  • Компилятор использует метод valueOf () для преобразования примитивов в соответствующие объекты-обертки (то есть для автоматической блокировки) внутри, в обратном случае он использует intValue (), doubleValue () и т. Д., Например, парадигмы для распаковки.
  • Для справки, отображение оболочки и примитивов в Java упоминается ниже -
Примитивный типКласс Wrapper
логическийлогический
байтБайт
голецсимвол
поплавоктерка
ИНТцелое число
длиннаяДлинная
короткаякороткий
двойнойдвойной

Примеры -

  • Давайте возьмем ArrayList из Integers, а затем воспользуемся концепцией распаковки -

import java.util.ArrayList;
public class MyClass (
public static void main(String args()) (
ArrayList intlist = new ArrayList();
//wrapper Integer objects being added here
intlist.add(1);
interest.add(2);
//auto-unboxing is happening here
int x = intlist.get(0);
System.out.println(x);
)
)

  • Следовательно, в приведенном выше примере, добавляя значение к x, мы видим, что x представляется примитивом, поэтому распаковка происходит здесь автоматически, пока выполняется это назначение.

public class MyClass (
public static void main(String args()) (
Integer sum =0;
for(int i=0;i<10;i++)
(
sum = sum + i;
)
System.out.println(sum);
)
)

  • Чуть выше мы показали пример -2 в этом контексте, где был представлен типичный сценарий. Если вы знакомы с созданием объектов в Java, вы можете увидеть, что «Integer sum = 0», объявляет объект, и когда мы выполняем вычисления внутри цикла for, мы видим, что примитивное значение «i» добавляется в оболочку « сумма».
  • Следовательно, можно обнаружить, что сначала произойдет преобразование из оболочки в примитив, поскольку оператор «+» работает только с примитивами, и, следовательно, сначала произойдет распаковка объекта, затем произойдет вычисление, затем снова будет автобокс объекта, а затем значение будет назначена переменная «сумма».
  • Это создает ненужные накладные расходы на JVM, поскольку многие промежуточные объекты Integer будут созданы и будут уничтожены (для последующей сборки мусора), поэтому может возникнуть замедление, поэтому с такой логикой следует обращаться осторожно.
  • Давайте теперь посмотрим на условия, отличные от общего восприятия, и будем иметь некоторый код, в котором очень важно понимать автобокс и распаковку -

Рассмотрите фрагмент, размещенный ниже, как вы думаете, что будет результатом этого?

public class Main
(
public static void main(String() args) (
Integer m = 34123;
Integer x = 34123;
System.out.println(x==m);
)
)

  • Если вы говорите «true», то вы «false», потому что вывод также «false», это потому, что мы можем сравнивать только целочисленный диапазон от -128 до 127, как это, для значений, выходящих из этого диапазона, они должны быть распакованный.
  • Следовательно, нам нужно сравнить intValue () вышеупомянутых целых чисел, а пока компилятор делает это, используя свойство valueOf ().
  • Вероятно, если это попадет в диапазон, указанный выше, то приведенный выше код будет иметь значение true, поскольку сначала он будет ссылаться на целочисленный литеральный пул для сравнения.

public class Main
(
public static void main(String() args) (
Integer m = 100;
Integer x = 100;
System.out.println(x==m);
)
)

Это приведет к «истинному» значению, так как 100 присутствует в буквальном пуле.

Автобокс и распаковка в Java с перегрузкой метода

  • Перед тем, как мы помечаем автоматическую коробку и распаковку для перегрузки метода, предполагается, что читатель знаком с концепцией перегрузки метода, мы просто дадим немного понимания, и для получения дополнительной информации, пожалуйста, обратитесь к документации Oracle по этому вопросу.
  • Перегрузка метода - это процесс, в котором одно и то же имя метода используется с другим количеством входных аргументов, различными типами данных переменных с одинаковыми именами и т. Д., Которые используются для представления нескольких вариантов любого метода вычисления в целом.
  • Давайте возьмем пример для того же, чтобы понять это глубже, и мы также представим вывод, который появляется на рисунке на этот раз -

public class Main
(
public static void main(String() args) (
Overload obj = new Overload();
int i =5;
obj.printval(5);
Integer m = i;
obj.printval(m);
)
)
class Overload
(
public void printval(int i)
(
System.out.println("printing the unboxed value "+ i);
)
public void printval(Integer i)
(
System.out.println("printing the autoboxed value "+ i);
)
)

Выход -

печать распакованного значения 5
печать автобоксов 5

Примечание. Вы можете запустить вышеуказанную программу в любой из IDE, чтобы получить вывод выше.

  • Следовательно, вышеупомянутое поведение ясно говорит о том, что метод автобокса широко используется в концепциях перегрузки и должен использоваться с осторожностью при кодировании.

Преимущества Autoboxing и Unboxing в Java-

  • Соответствующее преобразование выполняется компилятором автоматически.
  • Разработчик должен писать меньше кода и, следовательно, более чистый код.
  • Нет необходимости в ручном приведении типов.

Вывод

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

Рекомендуемые статьи

Это было руководство по Autoboxing и Unboxing в Java. Здесь мы также обсудим, что такое Autoboxing и Unboxing в Java? как это работает внутри с некоторыми примерами кодов? Вы также можете просмотреть наши другие предлагаемые статьи, чтобы узнать больше -

  1. Что такое JDBC?
  2. Что такое Generics в Java?
  3. Groovy против Java
  4. Что такое наследование Java?
  5. Примеры и как работают дженерики в C #
  6. JRE против JVM | Топ 8 отличий с (Инфографика)