Рубрики
Без рубрики

Ловушка Java – Автоматическая упаковка и распаковка

– Ловушка Java – Автобоксинг и распаковка

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

Можете ли вы определить проблему?

package com.mkyong;

import java.time.Duration;
import java.time.Instant;

public class JavaSum {

    public static void main(String[] args) {

        Instant start = Instant.now();

        Long total = 0L;
        for (long l = 0; l < Integer.MAX_VALUE; l++) {
            total += l;
        }

        Instant end = Instant.now();

        System.out.println(Duration.between(start, end).getSeconds() + " seconds");
        System.out.println("Total: " + total);

    }
}

Выход

6 seconds
Total: 2305843005992468481

P.S Прошедшее время может варьироваться.

. (Прокрутите вниз для ответа) . . . . . . .

Ответ

Смешанный тип примитива и упакованный тип примитива (класс-оболочка), упакованный тип примитива будет автоматически распакован ( Длинный -> длинный ). В приведенном выше примере переменная Long total неоднократно помещается в коробку и распаковывается, что приводит к медленному запуску программы.

  // Long -> unboxed -> long
  // long -> boxed   -> Long
  Long total = 0L; // boxed primitive type (wrapper class)
  for (long l = 0; l < Integer.MAX_VALUE; l++) { // here is primitive type!
      // Long = Long (unboxed) -> long + long
      // Long = (boxed) long
      total += l;
  }

Чтобы сделать это быстрее, обновите Длинный итог до длинный итог :

  long total = 0L;
  for (long l = 0; l < Integer.MAX_VALUE; l++) {
    total += l;  // no more boxed and unboxed, and it run much faster!
  }

Вернуться к основному:

  1. Автобоксинг – int -> Целое число , длинное -> Длинный , преобразовать длинный примитивный тип в упакованный примитивный тип (класс-оболочка) Длинный .
  2. Распаковка – Целое число – > int , Длинный -> длинный , преобразуйте Длинный упакованный примитивный тип (класс-оболочка) в примитивный тип длинный .
Логический логический
Байт байт
Характер обуглить
Поплавок плыть
Целое число инт
Длинный длинный
Короткий короткий
Двойной двойной

Рекомендации

Оригинал: “https://mkyong.com/java/java-trap-autoboxing-and-unboxing/”