Java代碼優(yōu)化

優(yōu)化實(shí)踐

1.try{}catch(){}使用

1)查詢中不要使用try{}catch(){}語(yǔ)句

2)循環(huán)中不要使用try{}catch(){}語(yǔ)句

3)異常處理

不要對(duì)于所有的異常捕獲都使用Exception,最好是捕獲對(duì)應(yīng)的異常類型澈圈,處理日志方式:

1普碎、打印錯(cuò)誤日志

2劫扒、調(diào)用錯(cuò)誤業(yè)務(wù)邏輯處理函數(shù)

?3湃望、跳轉(zhuǎn)錯(cuò)誤提示頁(yè)面

4)finally中銷毀對(duì)象或釋放資源

? ? ? ? ? finally塊代碼無(wú)論try{}catch(){}是否發(fā)生異常都會(huì)被訪問(wèn)拍屑,所以在這里可以做一些資源的釋放丙唧、對(duì)象的銷毀工作凡蜻,減少不必要的資源占用办桨。

5 ) 對(duì)外提供的接口有異常則拋出

try

{

? ? ? ? ? os.write(byteBuffer);

} catch (Exception e)

{

? ? ? ? ?e.printStackTrace();

} finally

{

? ? ? ? os.close();// 釋放資源

? ? ? ? os = null;

? ? ? ? destfile = null;

}

2.減少使用new關(guān)鍵字創(chuàng)建對(duì)象

1)避免在循環(huán)中使用new關(guān)鍵字創(chuàng)建對(duì)象

Java測(cè)試代碼(2)

?以10000次為測(cè)試標(biāo)準(zhǔn)筹淫,結(jié)果是:循環(huán)耗時(shí):16ms;如果將new Object();注釋掉呢撞,打印的結(jié)果是:循環(huán)耗時(shí):0ms损姜;由此看出對(duì)象的創(chuàng)建是一筆不小 ?的開銷。

?2)有必要?jiǎng)?chuàng)建對(duì)象時(shí)才進(jìn)行創(chuàng)建

Java測(cè)試代碼(3)

3.乘除法是否可以使用移位運(yùn)算

1)乘數(shù)或除數(shù)是否是2的平方根

2)乘除運(yùn)算在循環(huán)中反復(fù)出現(xiàn)

4.注意循環(huán)的寫法

1)減少循環(huán)次數(shù)變量的讀取

Java測(cè)試代碼(4)

2)循環(huán)中嵌套循環(huán)將小循環(huán)寫在外層

3)不要在循環(huán)中頻繁聲明對(duì)象

Java測(cè)試代碼(5)

4)循環(huán)中不要調(diào)用同步方法

Java測(cè)試代碼(6)

5)盡量避免循環(huán)中執(zhí)行db查詢操作

5.實(shí)現(xiàn)字符串拼接

1)String殊霞、StringBuffer摧阅、StringBuilder

String ?不可變字符數(shù)據(jù)類的拼接,每次使用“+=”時(shí)都相當(dāng)于引入了一個(gè)中間的臨時(shí)變量,不推薦绷蹲。

StringBuilder 可變字符串對(duì)象棒卷,線程不安全顾孽,不推薦。

可變字符串對(duì)象比规,線程安全若厚,當(dāng)前線程只有一個(gè)StringBuffer對(duì)象在實(shí)現(xiàn)字符串長(zhǎng)度的修改變化,推薦蜒什。

2)單個(gè)字符相加用’’代替””

對(duì)于單個(gè)字符测秸,用StringBuffer有些浪費(fèi),由于’’作用的是char類型的數(shù)據(jù)所以比String要適合吃谣。

Java測(cè)試代碼(7)

6.提升HashMap遍歷效率

Hashmap實(shí)現(xiàn)了Map接口乞封,其底層是用Entry對(duì)象來(lái)操作key和value的,Map的遍歷實(shí)就是利用Hash值取出相應(yīng)的Entry做比較得到結(jié)果岗憋。

for(Entry entry : paraMap.entrySet())

{

? ? ? ? ? ? values?=?entry.getValue();

? ? ? ? ? ? ? ?//?System.out.println(values[0]);

}

7.盡量使用局部變量

調(diào)用方法時(shí)傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時(shí)變量都保存在棧(Stack)中肃晚,速度較快。其他變量仔戈,如靜態(tài)變量关串、實(shí)例變量等,都在堆(Heap)中創(chuàng)建监徘,速度較慢晋修。

Java測(cè)試代碼(8)

8.盡量實(shí)現(xiàn)對(duì)象重用

1)字符串對(duì)象重用(StringBuffer)

2)聲明對(duì)象的重用(for循環(huán))

3)減少對(duì)象初始化(單例模式)

默認(rèn)情況下,調(diào)用類的構(gòu)造函數(shù)時(shí)凰盔, Java會(huì)把變量初始化成確定的值:所有的字符串變量被設(shè)置成null墓卦,整數(shù)變量(byte、short户敬、int落剪、long)設(shè)置成0,float和double變量設(shè)置成0.0尿庐,邏輯值設(shè)置成false忠怖。

Java測(cè)試代碼(9)

4)合理使用繼承和抽象

9.將閑置的資源進(jìn)行釋放

1)記得斷開數(shù)據(jù)庫(kù)訪問(wèn)鏈接

2)記得關(guān)閉I/O輸入輸出流

3)對(duì)象使用完成后進(jìn)行置空

對(duì)象使用完畢,應(yīng)手動(dòng)置成null抄瑟。

Java測(cè)試代碼(10)

10.ArrayList凡泣、Vector、LinkedList的使用

1)ArrayList實(shí)現(xiàn)隨機(jī)查找和遍歷

2)Vector實(shí)現(xiàn)數(shù)組同步操作

3)LinkedList數(shù)據(jù)的動(dòng)態(tài)插入和刪除

11.synchronized的使用

1)方法的同步

一旦有一個(gè)線程在訪問(wèn)該方法皮假,方法將陷入等待或阻塞鞋拟,只有用戶線程方法解鎖后才能被其他線程調(diào)用。

Java測(cè)試代碼(11)

2)代碼塊同步

此同步是為了保證一個(gè)線程中特殊的對(duì)象操作而存在的惹资,比如多個(gè)用戶有權(quán)限操作同一公共資源的時(shí)候就需要使用該方式實(shí)現(xiàn)資源的同步操作严卖。

Java測(cè)試代碼(12)

12.三元表達(dá)式代替if else

publicString express(booleanflag)

{

? ? ? ?returnflag??"成功":"失敗";

}

13.StringTokenizer代替substring()和indexOf()

StringTokenizer是java中object類的一個(gè)子類,繼承自 Enumeration( public interface Enumeration實(shí)現(xiàn) Enumeration(列舉) 接口的對(duì)象布轿,它生成一系列元素哮笆,一次生成一個(gè)来颤。)接口。

StringTokenizer 可以理解為String的字符標(biāo)記對(duì)象稠肘,此對(duì)象可以實(shí)現(xiàn)字符串的截取操作福铅,避免了字符串容易導(dǎo)致StringIndexOutOfBoundsException的問(wèn)題。其構(gòu)造器有下面三種形式:

·public StringTokenizer(String str,String delim,boolean returnTokens);

·public StringTokenizer(String str,String delim);

·public StringTokenizer(String str); 其中项阴,str為需分析的字符串滑黔,delim為定界符,Tokens描述是否將定界符作為一個(gè)token(令牌)环揽。

Java測(cè)試代碼(13)

結(jié)果打印的都是:boonya

14.System.arraycopy()實(shí)現(xiàn)數(shù)組值的拷貝

Java測(cè)試代碼(14)

15.instanceof判斷接口而不是接口的實(shí)現(xiàn)類

16.將類中不變的實(shí)例靜態(tài)化

如果類中的變量不會(huì)隨他的實(shí)例而變化略荡,就可以定義為靜態(tài)變量,從而使他所有的實(shí)例都共享這個(gè)變量歉胶。

public class AlarmDao extends BaseDao

{

? ?private static SortUtil?sortUtil ?= new SortUtil();

}

17.僅查找單個(gè)字符用charAt()代替startsWith()


Java測(cè)試代碼(15)

18.使用單元測(cè)試代替main方法

19.在數(shù)據(jù)庫(kù)應(yīng)用程序中使用批處理

20.線程使用技巧

1)使用大量線程(Threading)的場(chǎng)合使用線程池管理

2)防止過(guò)多的同步

3)同步方法而不要同步整個(gè)代碼段

4)在追求速度的場(chǎng)合汛兜,用ArrayList和HashMap代替Vector和Hashtable

5)使用notify()而不是notifyAll()

6)不要在循環(huán)中調(diào)用 synchronized(同步)方法

循環(huán)中調(diào)用 synchronized

7)單線程應(yīng)盡量使用 HashMap, ArrayList

21.I/O技巧

1)使州緩沖提高I/O性能

2)lnputStream比Reader高效,OutputStream比Writer高效

3)在適當(dāng)?shù)臅r(shí)候用byte替代char

4)在finally 塊中關(guān)閉stream


參考文獻(xiàn):

boonya博客:http://blog.csdn.net/boonya/article/details/13622169

林志Ke博客:http://blog.csdn.net/linlzk/article/details/42153435

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末通今,一起剝皮案震驚了整個(gè)濱河市粥谬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辫塌,老刑警劉巖漏策,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異臼氨,居然都是意外死亡掺喻,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門储矩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)感耙,“玉大人,你說(shuō)我怎么就攤上這事椰苟∫衷拢” “怎么了树叽?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵舆蝴,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我题诵,道長(zhǎng)洁仗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任性锭,我火速辦了婚禮赠潦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘草冈。我一直安慰自己她奥,他們只是感情好瓮增,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哩俭,像睡著了一般绷跑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凡资,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天砸捏,我揣著相機(jī)與錄音,去河邊找鬼隙赁。 笑死垦藏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的伞访。 我是一名探鬼主播掂骏,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼咐扭!你這毒婦竟也來(lái)了芭挽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蝗肪,失蹤者是張志新(化名)和其女友劉穎袜爪,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體薛闪,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辛馆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了豁延。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昙篙。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖诱咏,靈堂內(nèi)的尸體忽然破棺而出苔可,到底是詐尸還是另有隱情,我是刑警寧澤袋狞,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布焚辅,位于F島的核電站,受9級(jí)特大地震影響苟鸯,放射性物質(zhì)發(fā)生泄漏同蜻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一早处、第九天 我趴在偏房一處隱蔽的房頂上張望湾蔓。 院中可真熱鬧,春花似錦砌梆、人聲如沸默责。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)桃序。三九已至甘有,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間葡缰,已是汗流浹背亏掀。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泛释,地道東北人滤愕。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像怜校,于是被迫代替她去往敵國(guó)和親间影。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法茄茁,類相關(guān)的語(yǔ)法魂贬,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法裙顽,異常的語(yǔ)法付燥,線程的語(yǔ)...
    子非魚_t_閱讀 31,587評(píng)論 18 399
  • 可供程序利用的資源(內(nèi)存、CPU時(shí)間愈犹、網(wǎng)絡(luò)帶寬等)是有限的键科,優(yōu)化的目的就是讓程序用盡可能 少的資源完成預(yù)定的任務(wù)。...
    橫沖直撞666閱讀 252評(píng)論 0 0
  • 從三月份找實(shí)習(xí)到現(xiàn)在漩怎,面了一些公司勋颖,掛了不少,但最終還是拿到小米勋锤、百度饭玲、阿里、京東叁执、新浪茄厘、CVTE、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,192評(píng)論 11 349
  • 某一個(gè)Java前輩曾這樣理解過(guò)Java代碼優(yōu)化: 就像鯨魚吃蝦米一樣徒恋,也許吃一個(gè)兩個(gè)蝦米對(duì)于鯨魚來(lái)說(shuō)作用不大蚕断,但...
    Antidote799閱讀 187評(píng)論 0 0
  • 總要習(xí)慣一個(gè)人欢伏!
    微光222閱讀 142評(píng)論 0 0