【编者按】本文作者为 Ali Kemal TASCI,最早于2016年4月9日发布于DZONE社区。文章主要介绍通过改进 Java 1.5 就已存在的骨灰级特性大幅度提高应用性能

本文系 OneAPM 工程师编译呈现,以下为正文。

如果我告诉你:“只要修改一个字符,下面这段代码的运行速度就能提高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

OneAPM 为您提供端到端的 Java 应用性能解决方案,我们支持所有常见的 Java 框架及应用服务器,助您快速发现系统瓶颈,定位异常根本原因。分钟级部署,即刻体验,Java 监控从来没有如此简单。想阅读更多技术文章,请访问 OneAPM 官方技术博客

本文转自 OneAPM 官方博客

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

Java 性能要点:自动装箱/ 拆箱 (Autoboxing / Unboxing)的更多相关文章

  1. 自动装箱拆箱(Autoboxing,Unboxing)

    自动装箱和拆箱 https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html 1.5才有(Autoboxing,Unboxing) ...

  2. Java中的自动装箱拆箱

    Java中的自动装箱拆箱 一.自动装箱与自动拆箱 自动装箱就是将基本数据类型转换为包装类类型,自动拆箱就是将包装类类型转换为基本数据类型. 1 // 自动装箱 2 Integer total = 90 ...

  3. Java的自动装箱/拆箱

    概述 自JDK1.5开始, 引入了自动装箱/拆箱这一语法糖, 它使程序员的代码变得更加简洁, 不再需要进行显式转换.基本类型与包装类型在某些操作符的作用下, 包装类型调用valueOf()方法将原始类 ...

  4. java自动装箱拆箱总结

    对于java1.5引入的自动装箱拆箱,之前只是知道一点点,最近在看一篇博客时发现自己对自动装箱拆箱这个特性了解的太少了,所以今天研究了下这个特性.以下是结合测试代码进行的总结. 测试代码: int a ...

  5. JAVA的自动装箱拆箱

    转自:http://www.cnblogs.com/danne823/archive/2011/04/22/2025332.html 蛋呢  的空间 ??什么是自动装箱拆箱 基本数据类型的自动装箱(a ...

  6. Java 的自动装箱拆箱

    Java 是面向对象的语言,其基本数据类型也就有了相对应的类,称为包装类.以下是基本数据类型对应的包装类: 基本数据类型 包装类 byte(1字节) Byte short(2字节) Short int ...

  7. Java八种基本数据类型的大小,以及封装类,自动装箱/拆箱的用法?

    参考:http://blog.csdn.net/mazhimazh/article/details/16799925 1. Java八种基本数据类型的大小,以及封装类,自动装箱/拆箱的用法? 原始类型 ...

  8. JAVA自动装箱拆箱与常量池

    java 自动装箱与拆箱 这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好的记忆,毅然决定还是用一篇博客来代替我的记忆: java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的 ...

  9. java基础1.5版后新特性 自动装箱拆箱 Date SimpleDateFormat Calendar.getInstance()获得一个日历对象 抽象不要生成对象 get set add System.arrayCopy()用于集合等的扩容

    8种基本数据类型的8种包装类 byte Byte short Short int Integer long Long float Float double Double char Character ...

随机推荐

  1. 【标题】一本帮你提高Excel办公效率的VBA书

    公司工程部男同事,EXCEL能力最强的前三位,分别号称:大表哥 二表哥 三表哥 公司财务部女同事,EXCEL能力最强的前三位,分别号称:大表姐 二表姐 三表姐 想成为你们公司的“表哥”.“表姐”? 但 ...

  2. 刀哥多线程全局队列gcd-09-global_queue

    全局队列 是系统为了方便程序员开发提供的,其工作表现与并发队列一致 全局队列 & 并发队列的区别 全局队列 没有名称 无论 MRC & ARC 都不需要考虑释放 日常开发中,建议使用& ...

  3. uva 11186 Circum Triangle<叉积>

    链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  4. c++大数模板

    自己写的大数模板,参考了小白书上的写法,只是实现了加减乘法,不支持负数,浮点数.. 除法还没写o(╯□╰)o以后再慢慢更吧.. 其实除法我用(xie)的(bu)少(lai),乘法写过fft,这模板还是 ...

  5. jquery一个控件绑定多个事件

    jQuery("#id").bind("click mouseover",function(){})  // 两个事件中间有空格 $("p" ...

  6. 012--VS2013 C++ 斜角景物地图贴图-位图

    因为bmp图片上传不了,只能截图啦 //全局变量HDC mdc;HBITMAP fullmap;//声明位图对象,在初始化函数中完成的斜角地图会保存在这个位图中const int rows = 10, ...

  7. 009--VS2013 C++ 显示位图部分透明化

    其实这个更简单,只是把上一编文章的半透明化的代码去掉就可以啦 还是原来那张图片: //全局变量HBITMAP bg, girl;HDC mdc;//起始坐标const int xstart = 50; ...

  8. ArtJS(原创)

    <script> /* 方法目录: [IE7 8 不支持trim()方法的弥补] [ 终止冒泡] [数字千分位] [js运算的替代方法(js3.3/1.1不等于3浮点计算有bug)] [日 ...

  9. ios应运程序的五种状态

    ios应运程序的五种状态即转化  从apple的官方文档扣下来的 5状态: Not running The app has not been launched or was running but w ...

  10. mysql 慢查询开启

    相关博客: linux下开启mysql慢查询,分析查询语句 开启方法: 方法一:使用命令开启慢查询开启 mysql> show variables like "%long%" ...