专栏首页九州牧云Java 性能要点:自动装箱/ 拆箱 (Autoboxing / Unboxing)

Java 性能要点:自动装箱/ 拆箱 (Autoboxing / Unboxing)

要点速递:通过改进 Java 1.5 就已存在的骨灰级特性大幅度提高应用性能。

如果我告诉你:“只要修改一个字符,下面这段代码的运行速度就能提高5倍。”,你觉得可能么?

long t = System.currentTimeMillis();
Long sum = 0L;
for (long i = 0; i < Integer.MAX_VALUE; i++) {
	sum += i;
}
System.out.println("total:" + sum);
System.out.println("processing time: " + (System.currentTimeMillis() - t) + " ms");

输出结果: 总数:2305843005992468481 处理时间:6756 ms

仔细琢磨一下,你可能会想到下面这种执行速度更快的实现方法:

long t = System.currentTimeMillis();
//Long sum = 0L;
long sum = 0L;
for (long i = 0; i < Integer.MAX_VALUE; i++) {
	sum += i;
}
System.out.println("total:" + sum);
System.out.println("processing time: " + (System.currentTimeMillis() - t) + " ms") ;

输出结果: 总数:2305843005992468481 处理时间:1248 ms

其实,自动装箱(Autoboxing)的草率使用是造成速度差异的根本原因,而这一特性从 Java 1.5 开始就已出现了。

在继续解释造成差异的细节之前,让我们仔细回味一下 Java 中的这两个概念:自动装箱(Autoboxing)与 拆箱(Unboxing)。

Java 中的变量分为两种:原始型与引用型。一共存在8个原始型变量以及与各个原始变量对应的8个引用变量(包装类)。

Primitive Types(原始型)

Reference Types(Wrapper Class)(引用型,(包装类))

boolean

Boolean

byte

Byte

char

Character

float

Float

int

Integer

long

Long

short

Short

double

Double

下面的代码会介绍”Autoboxing“与”Unboxing“的用例。在这段代码中,一个类型为"long"的值被添加到类型为”Long“的List集合中。在 Java 1.4 中,为了实现此操作,我们必须将原始变量赋值到合适的引用类中(也即装箱,boxing)。从 Java 1.5 开始,编译器会帮我们完成这一操作。所以,我们不再需要写那么多代码。

List<Long> longList = new ArrayList<>();      
long i = 4;
longList.add( i ); //autoboxing      
long j = longList.get( 0 ); //unboxing

从 Java 1.5 开始,编译器会自动将上面的代码段转化成如下代码:

List<Long> longList = new ArrayList<>();      
long i = 4;
longList.add(Long.valueOf( i ) );      
long j = longList.get( 0 ).longValue();

因此,我们也可以说,前文出现的第一段代码段会自动转化为如下代码。所以,导致处理时间较长的原因也就水落石出了:不必要地创建了2147483647个”Long“类型实例。

long t = System.currentTimeMillis();
Long sum = 0L;
for (long i = 0; i < Integer.MAX_VALUE; i++) {
sum += new Long(i);
}
System.out.println("total:" + sum);
System.out.println("processing time: " + (System.currentTimeMillis() - t) + " ms") ;

由此可知,想要编写速度更快的 Java 代码,我们也需要考虑"Autoboxing"与"Unboxing"这样的基础概念。

##相关资源集锦

Autoboxing and Unboxing Autoboxing Efective Java 2nd Edition, J. Bloch

原文地址:https://dzone.com/articles/java-performance-notes-autoboxing-unboxing

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 分布式系统中的定时任务全解(三)

    前两篇从java语言中定时任务的基础实现,到第三方框架依赖下的常用实现方式都已经讲到了。

    九州暮云
  • Hadoop技术资料汇总(不断更新中)

    How does the HDFS balancer work internally?

    九州暮云
  • brew 安装 java

    运行以上命令之后,Java8就被安装在/Library/Java/JavaVirtualMachines/jdk1.8.xxx.jdk/目录下。

    九州暮云
  • 伪元素清除浮动(重要) 利用伪元素:after清除浮动

    让页面呈现多列布局时经常会使用 float:left/right ,可是浮动布局会导致父元素的高度为0(未设置高度的情况下),不会根据子元素的高度而变化,另外...

    IT人一直在路上
  • 智能问答:LSTM 句子相似度分析

    使用句子中出现单词的Vector加权平均进行文本相似度分析虽然简单,但也有比较明显的缺点:没有考虑词序且词向量区别不明确。如下面两个句子:

    机器学习AI算法工程
  • LeetCode 113 Path Sum II

    ShenduCC
  • 2018-01-14 HTTP TCP

    HTTP持续连接下,请求可连续发出,并连续地接受响应。 计算机网络 ——自顶向下方法 第四版 英文 P.291

    平凡的学生族
  • vue中表单双向绑定,怎么高效清空?

    在不使用vue框架的情况下,清空表单很容易,直接操作dom即可,但是使用了vue,将表单中的数据与vue实例中的data绑定,操作表单后清空表单似乎没那么好理解...

    挥刀北上
  • 怎么搭建直播平台,合理使用验证码工具类

    yunbaokeji柯基
  • C# 鼠标悬停在datagridview的某单元格,显示悬浮框效果

    本文转载:http://www.cnblogs.com/bribe/archive/2013/10/08/3357345.html

    跟着阿笨一起玩NET

扫码关注云+社区

领取腾讯云代金券