Java 性能要點:自動裝箱/ 拆箱 (Autoboxing / Unboxing)

要點速遞:經過改進 Java 1.5 就已存在的骨灰級特性大幅度提升應用性能。html

若是我告訴你:「只要修改一個字符,下面這段代碼的運行速度就能提升5倍。」,你以爲可能麼?java

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 msoracle

仔細琢磨一下,你可能會想到下面這種執行速度更快的實現方法:app

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 mside

其實,自動裝箱(Autoboxing)的草率使用是形成速度差別的根本緣由,而這一特性從 Java 1.5 開始就已出現了。性能

在繼續解釋形成差別的細節以前,讓咱們仔細回味一下 Java 中的這兩個概念:自動裝箱(Autoboxing)與 拆箱(Unboxing)。ui

Java 中的變量分爲兩種:原始型與引用型。一共存在8個原始型變量以及與各個原始變量對應的8個引用變量(包裝類)。code

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 開始,編譯器會幫咱們完成這一操做。因此,咱們再也不須要寫那麼多代碼。orm

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

從 Java 1.5 開始,編譯器會自動將上面的代碼段轉化成以下代碼:htm

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

相關文章
相關標籤/搜索