JAVA編程提高性能時需注意的地方(二)

      1.盡量避免不必要的創(chuàng)建

      A a = new A();

      if(i==1){list.add(a);}

      應(yīng)該改為

      if(i==1){

      A a = new A();

      list.add(a);}

      2.盡量在finally塊中釋放資源

      程序中使用到的資源應(yīng)當被釋放,以避免資源泄漏。這最好在finally塊中去做。不管程序執(zhí)行的結(jié)果如何,finally塊總是會執(zhí)行的,以確保資源的正確關(guān)閉。 

      3.盡量使用移位來代替'a/b'的操作

      "/"是一個代價很高的操作,使用移位的操作將會更快和更有效

      int num = a / 4;

      int num = a / 8;

      應(yīng)該改為

      int num = a >> 2;

      int num = a >> 3;

      但注意的是使用移位應(yīng)添加注釋,因為移位操作不直觀,比較難理解

      4.盡量使用移位來代替'a*b'的操作

      同樣的,對于'*'操作,使用移位的操作將會更快和更有效

      int num = a * 4;

      int num = a * 8;

      應(yīng)該改為

      int num = a << 2;

      int num = a << 3;

      5.盡量確定StringBuffer的容量

      StringBuffer的構(gòu)造器會創(chuàng)建一個默認大小(通常是16)的字符數(shù)組。在使用中,如果超出這個大小,就會重新分配內(nèi)存,創(chuàng)建一個更大的數(shù)組,并將原先的數(shù)組復(fù)制過來,再丟棄舊的數(shù)組。在大多數(shù)情況下,你可以在創(chuàng)建 StringBuffer的時候指定大小,這樣就避免了在容量不夠的時候自動增長,以提高性能。

      如:StringBuffer buffer = new StringBuffer(1000); 

      6.盡量早釋放無用對象的引用

      大部分時,方法局部引用變量所引用的對象 會隨著方法結(jié)束而變成垃圾,因此,大部分時候程序無需將局部,引用變量顯式設(shè)為null

      例如:

      Public void test(){

      Object obj = new Object();

      ……

      Obj=null;

      }

      上面這個就沒必要了,隨著方法test()的執(zhí)行完成,程序中obj引用變量的作用域就結(jié)束了。但是如果是改成下面:

      Public void test(){

      Object obj = new Object();

      ……

      Obj=null;

      //執(zhí)行耗時,耗內(nèi)存操作;或調(diào)用耗時,耗內(nèi)存的方法

      ……

      }

      這時候就有必要將obj賦值為null,可以盡早的釋放對Object對象的引用。

      7.盡量避免使用二維數(shù)組

      二維數(shù)據(jù)占用的內(nèi)存空間比一維數(shù)組多得多,大概10倍以上。

      8.盡量避免使用split

      除非是必須的,否則應(yīng)該避免使用splitsplit由于支持正則表達式,所以效率比較低,如果是頻繁的幾十,幾百萬的調(diào)用將會耗費大量資源,如果確實需要頻繁的調(diào)用split,可以考慮使用apacheStringUtils.split(string,char),頻繁split的可以緩存結(jié)果。

      9.ArrayList & LinkedList

      一個是線性表,一個是鏈表,一句話,隨機查詢盡量使用ArrayListArrayList優(yōu)于LinkedListLinkedList還要移動指針,添加刪除的操作LinkedList優(yōu)于ArrayListArrayList還要移動數(shù)據(jù),不過這是理論性分析,事實未必如此,重要的是理解好2者得數(shù)據(jù)結(jié)構(gòu),對癥下藥。

      10.盡量使用System.arraycopy ()代替通過來循環(huán)復(fù)制數(shù)組

      System.arraycopy() 要比通過循環(huán)來復(fù)制數(shù)組快的多 

      11.盡量緩存經(jīng)常使用的對象

      盡可能將經(jīng)常使用的對象進行緩存,可以使用數(shù)組,或HashMap的容器來進行緩存,但這種方式可能導(dǎo)致系統(tǒng)占用過多的緩存,性能下降,推薦可以使用一些第三方的開源工具,如EhCacheOscache進行緩存,他們基本都實現(xiàn)了FIFO/FLU等緩存算法。

      12.盡量避免非常大的內(nèi)存分配

      有時候問題不是由當時的堆狀態(tài)造成的,而是因為分配失敗造成的。分配的內(nèi)存塊都必須是連續(xù)的,而隨著堆越來越滿,找到較大的連續(xù)塊越來越困難。

      13.慎用異常

      當創(chuàng)建一個異常時,需要收集一個棧跟蹤(stack track),這個棧跟蹤用于描述異常是在何處創(chuàng)建的。構(gòu)建這些棧跟蹤時需要為運行時棧做一份快照,正是這一部分開銷很大。當需要創(chuàng)建一個 Exception 時,JVM 不得不說:先別動,我想就您現(xiàn)在的樣子存一份快照,所以暫時停止入棧和出棧操作。棧跟蹤不只包含運行時棧中的一兩個元素,而是包含這個棧中的每一個元素。

      如果創(chuàng)建一個 Exception ,就得付出代價。好在捕獲異常開銷不大,因此可以使用 try-catch 將核心內(nèi)容包起來。從技術(shù)上講,甚至可以隨意地拋出異常,而不用花費很大的代價。招致性能損失的并不是 throw 操作——盡管在沒有預(yù)先創(chuàng)建異常的情況下就拋出異常是有點不尋常。真正要花代價的是創(chuàng)建異常。幸運的是,好的編程習慣已教會我們,不應(yīng)該不管三七二十一就拋出異常。異常是為異常的情況而設(shè)計的,使用時也應(yīng)該牢記這一原則。

      北大青鳥網(wǎng)上報名
      北大青鳥招生簡章
      主站蜘蛛池模板: 成人精品一区二区三区中文字幕| 老熟妇高潮一区二区三区| 亚洲日本一区二区| 亚洲午夜精品一区二区公牛电影院| 视频一区二区精品的福利| 一区二区三区日韩精品| 色老板在线视频一区二区| 无码日韩精品一区二区免费暖暖 | 国产精品揄拍一区二区| 在线一区二区三区| 交换国产精品视频一区| 人妻无码一区二区三区四区| 一区二区三区内射美女毛片| 3D动漫精品啪啪一区二区下载| 国产精品一区二区三区久久| 文中字幕一区二区三区视频播放 | 精品欧美一区二区在线观看| 极品人妻少妇一区二区三区| 99精品久久精品一区二区| 国产精品女同一区二区久久| 国产精品污WWW一区二区三区 | 国产成人一区在线不卡| 一区二区三区国模大胆| 精品一区二区三区免费毛片爱| 日本在线视频一区| 消息称老熟妇乱视频一区二区| 亚洲香蕉久久一区二区三区四区| 成人免费视频一区二区三区| 国产AV国片精品一区二区| 一区二区三区福利视频免费观看| 久久精品无码一区二区三区免费 | 国产伦精品一区二区三区在线观看| 国产日本亚洲一区二区三区| 国产福利一区二区在线视频| 少妇激情av一区二区| 日韩精品一区二区三区中文字幕| 亚洲国产美国国产综合一区二区| 精品天海翼一区二区| 中文字幕亚洲综合精品一区| 色狠狠色噜噜Av天堂一区| 国产品无码一区二区三区在线|