Приведенная ниже программа является типичной ловушкой 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! }
Вернуться к основному:
- Автобоксинг –
int
->Целое число
,длинное
->Длинный
, преобразоватьдлинный
примитивный тип в упакованный примитивный тип (класс-оболочка)Длинный
. - Распаковка –
Целое число
– >int
,Длинный
->длинный
, преобразуйтеДлинный
упакованный примитивный тип (класс-оболочка) в примитивный типдлинный
.
Логический | логический |
Байт | байт |
Характер | обуглить |
Поплавок | плыть |
Целое число | инт |
Длинный | длинный |
Короткий | короткий |
Двойной | двойной |
Рекомендации
Оригинал: “https://mkyong.com/java/java-trap-autoboxing-and-unboxing/”