Java 性能要點(diǎn):自動(dòng)裝箱/ 拆箱 (Autoboxing / Unboxing)

【編者按】本文作者為 Ali Kemal TASCI践图,最早于2016年4月9日發(fā)布于DZONE社區(qū)。文章主要介紹通過改進(jìn) Java 1.5 就已存在的骨灰級(jí)特性大幅度提高應(yīng)用性能沉馆。

本文系 OneAPM 工程師編譯呈現(xiàn)码党,以下為正文。

如果我告訴你:“只要修改一個(gè)字符斥黑,下面這段代碼的運(yùn)行速度就能提高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");

輸出結(jié)果:
總數(shù):2305843005992468481
處理時(shí)間:6756 ms

仔細(xì)琢磨一下,你可能會(huì)想到下面這種執(zhí)行速度更快的實(shí)現(xiàn)方法:

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") ;

輸出結(jié)果:
總數(shù):2305843005992468481
處理時(shí)間:1248 ms

其實(shí)缨叫,自動(dòng)裝箱(Autoboxing)的草率使用是造成速度差異的根本原因椭符,而這一特性從 Java 1.5 開始就已出現(xiàn)了。

在繼續(xù)解釋造成差異的細(xì)節(jié)之前耻姥,讓我們仔細(xì)回味一下 Java 中的這兩個(gè)概念:自動(dòng)裝箱(Autoboxing)與 拆箱(Unboxing)销钝。

Java 中的變量分為兩種:原始型與引用型。一共存在8個(gè)原始型變量以及與各個(gè)原始變量對(duì)應(yīng)的8個(gè)引用變量(包裝類)琐簇。

Primitive Types(原始型) Reference Types(Wrapper Class)(引用型蒸健,(包裝類))
boolean Boolean
byte Byte
char Character
float Float
int Integer
long Long
short Short
double Double

下面的代碼會(huì)介紹”Autoboxing“與”Unboxing“的用例座享。在這段代碼中,一個(gè)類型為”long”的值被添加到類型為”Long“的List集合中似忧。在 Java 1.4 中渣叛,為了實(shí)現(xiàn)此操作,我們必須將原始變量賦值到合適的引用類中(也即裝箱盯捌,boxing)淳衙。從 Java 1.5 開始,編譯器會(huì)幫我們完成這一操作饺著。所以箫攀,我們不再需要寫那么多代碼。

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

從 Java 1.5 開始幼衰,編譯器會(huì)自動(dòng)將上面的代碼段轉(zhuǎn)化成如下代碼:

List<Long> longList = new ArrayList<>();      
long i = 4;
longList.add(Long.valueOf( i ) );      
long j = longList.get( 0 ).longValue();

因此靴跛,我們也可以說,前文出現(xiàn)的第一段代碼段會(huì)自動(dòng)轉(zhuǎn)化為如下代碼渡嚣。所以梢睛,導(dǎo)致處理時(shí)間較長(zhǎng)的原因也就水落石出了:不必要地創(chuàng)建了2147483647個(gè)”Long“類型實(shí)例。

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”這樣的基礎(chǔ)概念。

相關(guān)資源集錦

Autoboxing and Unboxing
Autoboxing
Efective Java 2nd Edition, J. Bloch

OneAPM 為您提供端到端的 Java 應(yīng)用性能解決方案裤唠,我們支持所有常見的 Java 框架及應(yīng)用服務(wù)器挤牛,助您快速發(fā)現(xiàn)系統(tǒng)瓶頸,定位異常根本原因种蘸。分鐘級(jí)部署墓赴,即刻體驗(yàn),Java 監(jiān)控從來沒有如此簡(jiǎn)單航瞭。想閱讀更多技術(shù)文章诫硕,請(qǐng)?jiān)L問 OneAPM 官方技術(shù)博客

本文轉(zhuǎn)自 OneAPM 官方博客

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刊侯,一起剝皮案震驚了整個(gè)濱河市章办,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌滨彻,老刑警劉巖藕届,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異亭饵,居然都是意外死亡休偶,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門辜羊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來踏兜,“玉大人词顾,你說我怎么就攤上這事〖钭保” “怎么了肉盹?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)疹尾。 經(jīng)常有香客問我上忍,道長(zhǎng),這世上最難降的妖魔是什么纳本? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任睡雇,我火速辦了婚禮,結(jié)果婚禮上饮醇,老公的妹妹穿的比我還像新娘。我一直安慰自己秕豫,他們只是感情好朴艰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著混移,像睡著了一般祠墅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上歌径,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天毁嗦,我揣著相機(jī)與錄音,去河邊找鬼回铛。 笑死狗准,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的茵肃。 我是一名探鬼主播腔长,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼验残!你這毒婦竟也來了捞附?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤您没,失蹤者是張志新(化名)和其女友劉穎鸟召,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體氨鹏,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡欧募,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了喻犁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片槽片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡何缓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出还栓,到底是詐尸還是另有隱情碌廓,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布剩盒,位于F島的核電站谷婆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏辽聊。R本人自食惡果不足惜纪挎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望跟匆。 院中可真熱鬧异袄,春花似錦、人聲如沸玛臂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)迹冤。三九已至讽营,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泡徙,已是汗流浹背橱鹏。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留堪藐,地道東北人莉兰。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像礁竞,于是被迫代替她去往敵國(guó)和親贮勃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法苏章,類相關(guān)的語(yǔ)法寂嘉,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法枫绅,異常的語(yǔ)法泉孩,線程的語(yǔ)...
    子非魚_t_閱讀 31,631評(píng)論 18 399
  • 自動(dòng)裝箱和拆箱從Java1.5開始引入,目的是將原始類型值轉(zhuǎn)自動(dòng)地轉(zhuǎn)換成對(duì)應(yīng)的對(duì)象并淋。自動(dòng)裝箱與拆箱的機(jī)制可以讓我們...
    GB_speak閱讀 619評(píng)論 0 4
  • 從三月份找實(shí)習(xí)到現(xiàn)在寓搬,面了一些公司,掛了不少县耽,但最終還是拿到小米句喷、百度镣典、阿里、京東唾琼、新浪兄春、CVTE、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,246評(píng)論 11 349
  • 作為一個(gè)程序員,在找工作的過程中,都會(huì)遇到筆試,而很多筆試?yán)锩娑及╦ava,尤其是作為一個(gè)Android開發(fā)工程...
    左神話閱讀 8,005評(píng)論 15 295
  • 被嫌棄的松子的一生,講的是這樣的一個(gè)故事:因?yàn)橥陼r(shí)多病的妹妹久美吸引了父親大部分的關(guān)注祭饭,為了得到父親的關(guān)注芜茵,松子...
    布小意閱讀 399評(píng)論 1 1