要點速遞:經過改進 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