Java陷阱–自动装箱和拆箱

下面的程序是一个典型的Java陷阱,也是一个受欢迎的Java面试问题。 它没有编译器错误或警告,但运行速度非常慢。

你能发现问题吗?

JavaSum.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

PS经过的时间可能会有所不同。

(向下滚动以获得答案)













回答

混合使用的原语类型和盒装基本类型(包装类)的,盒装原始类型将自动取消装箱( Long - > long )。 在上面的示例中, 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更改为long total

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 - > Integerlong - > Long ,转换long原始类型到装箱基本类型(包装类) Long
  2. 拆箱- Integer - > intLong - > long ,转换Long盒装基本类型(包装类),以基本类型long
原始类型 包装类
布尔值 布尔型
字节 字节
烧焦 字符
浮动 浮动
整型 整数

参考文献

  • 自动装箱和拆箱

翻译自: https://mkyong.com/java/java-trap-autoboxing-and-unboxing/

你可能感兴趣的:(Java陷阱–自动装箱和拆箱)