`
OneAPM_Official
  • 浏览: 22620 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

 

 【编者按】本文作者为 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(原始型)
 
 boolean  
 byte  
 char  
 float  
 int  
 long  
 short  
 double  

 

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

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语言 包装类讲解案例代码 ( 设计目的(作用)和用途、自动装箱与拆箱、常用方法、 null和默认值)

    自动装箱与拆箱:自动装箱(Autoboxing)指的是自动地将基本数据类型转换为对应的包装类对象;自动拆箱(Unboxing)则是将包装类对象自动转换为基本数据类型。 常用方法:演示如何使用包装类中的这些常见方法。 null...

    java自动装箱拆箱深入剖析

    基本数据(Primitive)类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的(在这种情况下包装成为装箱,解包装称为拆箱)

    常用Java代码65个附示例代码

    3.Java中的自动装箱和拆箱(Autoboxing and Unboxing) 4.Java中的注解处理器(Annotation Processing) 5.Java中的Lambda表达式和函数式接口 6.Java中的Optional类和null安全编程 7.Java中的并发集合...

    关于Java自动装箱(autoboxing)的一些意想不到的结果

    Java 的自动装箱有很多意想不到的结果,其中有些是广为人知的,这些奇怪的结果多数是 因为自动装箱对象的缓存导致的。

    Java Language Specification, Third Edition

    &lt;br/&gt;中文译名:Java编程规范(第三版) &lt;br/&gt; &lt;br/&gt;http://www.china-pub.com/30979 &lt;br/&gt; &lt;br/&gt;By James Gosling, Bill Joy, Guy Steele, Gilad Bracha &lt;br/&gt;&lt;br/&gt; &lt;br/&gt;Written by the inventors of the technology...

    Java2核心技术卷I+卷2:基础知识(第8版) 代码

    Java 核心技术 卷1 Index Chapter 1: An Introduction to Java 1 Java As a Programming Platform 2 The Java “White Paper” Buzzwords 2 Java Applets and the Internet 7 A Short History of Java 9 ...

    JAVA基础课程讲义

    自动装箱和拆箱?autoboxing,unboxing 119 字符串相关类(String、 StringBuffer 、 StringBuilder) 120 String类的常用方法(已讲过,不再讲!) 120 StringBuffer和StringBuilder 121 String和StringBuffer和...

    Eclipse3.1中体验J2SE5.0之枚举类型

    本文将介绍J2SE5.0中三个比较重要的...这些特性包括范型(generics)的支持,枚举类型(enumeration)的支持,元数据(metadata)的支持,自动拆箱(unboxing)/装箱(autoboxing),可变个数参数(varargs),静态导入(staticimports),

    Java The Complete Reference ,11th Edition.pdf

    Java: The Complete Reference, Eleventh Edition By 作者: Herbert Schildt ISBN-10 书号: 1260440230 ISBN-13 书号: 9781260440232 Edition 版本: 11 出版日期: 2018-12-12 pages 页数: (1955) The Definitive ...

    Learn.Java.for.Android.Development_Apress.2010+src

    Continuing, you investigate strictfp, class literals, synchronized, volatile, the enhanced for loop statement, autoboxing/unboxing, and transient fields. The book also briefly presents most (if not ...

    leetcodelrucache-algorithm:算法学习和练习

    自动装箱拆箱 jdk.longaccumulator 计数器 jdk.threadlocal DateFormatService: 如何线程安全的使用 SimpleDateFormat jdk.volatilex VolatileArrays: volatile 例子 jdk.collection.union JDK: javaAPI 方式 ...

    java 混淆工具,不可逆 jocky 也许是最好的了

    譬如Generics、Enhanced for Loop以及 Autoboxing/Unboxing等。但另人遗憾的是,倘若利用这些新的语法开发应用,就意味着不能够在JDK 1.4上运行,而JDK 1.4毕竟是目前最为普及的VM版本。幸运是,Jocky的另一个特色...

    java.核心技术.第八版 卷1

    java 核心技术 第八版 core 卷1 Core Java, 8th Edition Core Java. Volume I. Fundamentals, 8th Edition Core Java. Volume II. Advanced Features, 8th Edition 官方网站 http://horstmann.com/corejava.html ...

    Java语言规范(第三版) 英文

    Written by the inventors of the technology, The Java™ Language Specification, Third Edition, is the definitive technical reference for the Java™ programming language. If you want to know the precise...

    Java-Language-Specification-3rd-Edition

    全面、准确、详尽地介绍了Java语言及其语法,论述了Java编译器所要检查的语法和Java运行模式的各个方面,同时还描述了Java语盲最重要的新特征(包括generics、annotationS、aSSertS、autoboxing、enumS、for-...

    JAVA 5.0 TIGER程序高手秘笈

    java高手秘笈详细讲解了java底层的一点事 StringBuilder ...Autoboxing 和Unboxing vararge 可变参数 类型...数组名 Annotation @Override @Deprecated for/in 静态的import 格式化 Formatter Thread

    JDK1.6学习笔记 林信良

    Java学习笔记 台湾 林信良 什么是Java 从autoboxing、unboxing认识对象 语法入门 Annotation 文本编辑器 Java SE6新功能简介 继承、多型

Global site tag (gtag.js) - Google Analytics