国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

Jackwoo / 2490人閱讀

摘要:文章主要介紹通過改進就已存在的骨灰級特性大幅度提高應用性能。在繼續解釋造成差異的細節之前,讓我們仔細回味一下中的這兩個概念自動裝箱與拆箱。

【編者按】本文作者為 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 longList = new ArrayList<>();      
long i = 4;
longList.add( i ); //autoboxing      long j = longList.get( 0 ); //unboxing

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

List 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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65808.html

相關文章

  • 深入淺出了解“裝箱拆箱

    摘要:本章部分內容從源碼中解讀一些自動裝箱與拆箱的原理,以及會出現的一些陷阱已經性能等。例題分析我們通過幾個經典的問題,來看看大家到底理解了裝箱與拆箱的知識點沒。 showImg(https://img-blog.csdnimg.cn/20190426221838971.gif);showImg(https://img-blog.csdnimg.cn/20190426221918208.pn...

    FullStackDeveloper 評論0 收藏0
  • JAVA 三目運算時遇到的坑

    摘要:但是,三目運算符也是有一定的語言規范的。一三目運算符對于條件表達式,先計算條件,然后進行判斷。那么,這段代碼為什么會自動拆箱呢這其實是三目運算符的語法規范。所以,結果就是由于使用了三目運算符,并且第二第三位操作數分別是基本類型和對象。 三目運算符是我們經常在代碼中使用的,a= (b==null?0:1);這樣一行代碼可以代替一個if-else,可以使代碼變得清爽易讀。 但是,三目運算符...

    jasperyang 評論0 收藏0
  • Java? 教程(自動裝箱拆箱

    自動裝箱和拆箱 自動裝箱是Java編譯器在基元類型和相應的對象包裝類之間進行的自動轉換,例如,將int轉換為Integer,將double轉換為Double,依此類推,如果轉換是另一種方式,則稱為拆箱。 以下是自動裝箱的最簡單示例: Character ch = a; 本節中的其余示例使用泛型,如果您還不熟悉泛型的語法,請參閱泛型課程。 考慮以下代碼: List li = new ArrayLis...

    cuieney 評論0 收藏0
  • Java Integer的緩存策略

    摘要:整型對象在內部實現中通過使用相同的對象引用實現了緩存和重用。這種緩存策略僅在自動裝箱的時候有用,使用構造器創建的對象不能被緩存。行的結果為而行則為。所以行的結果為而行為。中其他類似的緩存的緩存上限可以通過虛擬機參數修改,的緩存則沒法修改。 Java5為Integer的操作引入了一個新的特性,用來節省內存和提高性能。整型對象在內部實現中通過使用相同的對象引用實現了緩存和重用。上面的規則默...

    endiat 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<