Java編程代碼性能優(yōu)化
一、咱們之所以這么干的目的:
1.效率(最重要)
2.可讀性,便于后期維護(hù)。(同樣很重要)
二、代碼優(yōu)化的要求:
1.減小代碼的體積。
2.提高代碼的運(yùn)行效率。
三、常用的代碼的優(yōu)化:
1、盡量重用對(duì)象 :
特別是String對(duì)象的重用。最常用的就是字符串的拼接:
當(dāng)遇到頻繁擦拼接String時(shí)。記住一定用StringBuilder/StringBuffer
例如:
ArrayList<String> list; //省去list初始化。 StringBuilder builder = new StringBuilder(); for (String s : list) { builder.append(s); } String result = builder.toString();
原因:Java虛擬機(jī)不僅要花時(shí)間生成對(duì)象,而且還要花時(shí)間處理和回收對(duì)象,生成過(guò)多對(duì)象必定會(huì)給程序性能帶來(lái)影響。
2. 盡可能使用局部變量 :
局部變量在棧中創(chuàng)建,創(chuàng)建速度快,用完即自動(dòng)消失,不需要額外的垃圾回收。
而靜態(tài)變量、實(shí)例變量等在堆中創(chuàng)建,創(chuàng)建速度慢,同時(shí)還依賴Java垃圾回收機(jī)制處理。
3. 及時(shí)關(guān)閉流 :
Java程序開發(fā)中,在對(duì)I/O,數(shù)據(jù)庫(kù)操作結(jié)束后,一定要記住關(guān)閉流。
原因:未關(guān)閉流會(huì)對(duì)系統(tǒng)造成很大的開銷,甚至?xí)?duì)數(shù)據(jù)造成嚴(yán)重的后果。
4. 使用懶加載
懶加載 : 當(dāng)要用的時(shí)候才創(chuàng)建該對(duì)象。
例如:
String prefix = "gebi"; if ("laowang".equals(name)) { list.add(prefix + name); }
替換為:
if("laowang".equals(name)) { String prefix = "gebi"; list.add(prefix + name); }
5.避免在循環(huán)中使用try...catch,在循環(huán)外層使用try...catch
6.try...catch不宜太大。
不要將無(wú)用代碼,即不會(huì)拋出異常的代碼統(tǒng)統(tǒng)放入try...catch塊中,減小try...catch代碼塊的大小。
保證代碼的可讀性,易維護(hù)性,健壯性。
7.循環(huán)內(nèi)盡量避免創(chuàng)建對(duì)象的引用。
尤其是循環(huán)量大的時(shí)候。
while (i<1000) { Object object = new Object(); }
建議修改為:
Object object = null; while (i<1000) { object = new Object();
每次new Object()的時(shí)候,Object對(duì)象引用指向Object對(duì)象。
當(dāng)循環(huán)次數(shù)多的時(shí)候,如第一種,JVM會(huì)創(chuàng)建1000個(gè)對(duì)象的引用,而第二種內(nèi)存中只有一份Object對(duì)象引用。這樣就大大節(jié)省了內(nèi)存空間了。
8.不要隨意使用static變量。
當(dāng)對(duì)象被聲明為static的變量所引用時(shí),此時(shí),Java垃圾回收器不會(huì)清理這個(gè)對(duì)象所占用的堆內(nèi)存。
靜態(tài)變量所占用的堆內(nèi)存直到該變量所在類所在程序結(jié)束才被釋放。 即靜態(tài)變量生命周期=類生命周期。
9.不要?jiǎng)?chuàng)建一些不使用的對(duì)象,不要導(dǎo)入一些不使用的類。
10.使用帶緩沖的I/O流:
帶緩沖的I/O流可以極大提高I/O效率。BufferedWriter, BufferedReader, BufferedInputStream, BufferedOutputStream。
11.包裝類數(shù)據(jù)轉(zhuǎn)換為字符串使用: toString
Integer i = 1;
包裝類數(shù)據(jù)轉(zhuǎn)換為字符串方法速度排名 :
i.toString > String.valueOf(i) > "" + i
12.Map遍歷效率 : entrySet > keySet
//entrySet() for (Entry<String, String> entry : map.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); System.out.println(key + " : " + value); } //上下對(duì)比 //keySet() for (String key : map.keySet()) { String value = map.get(key); System.out.println(key + " : " + value); }
13.關(guān)于Iterator與forEach()的集合遍歷舍取。
算法導(dǎo)論上說(shuō):算法是為了提高空間效率和時(shí)間效率。但往往時(shí)間和空間不能并存。
時(shí)間效率:Iterator > forEach()
代碼可讀性 : forEach() > Iterator
//Iterator Set<Entry<String, String>> entrySet = map.entrySet(); Iterator<Entry<String, String>> iter = entrySet.iterator(); while (iter.hasNext()) { Entry<String, String> entry = iter.next(); String key = entry.getKey(); String value = entry.getValue(); System.out.println(key + " : " + value); }
對(duì)比:
//forEach() for (Entry<String, String> entry : map.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); System.out.println(key + " : " + value); }
個(gè)人認(rèn)為:當(dāng)處理大數(shù)據(jù)時(shí)推薦使用Iterator遍歷集合。
但處理小數(shù)據(jù)的話,為了可讀性和后期維護(hù)還是使用forEach()。
兩者結(jié)合使用,都應(yīng)該掌握。
相關(guān)文章
Java集合ArrayList、LinkedList、HashMap、HashSet最大容量
在開發(fā)中我們使用比較多的集合就是List、Set和Map了,并且我們也知道大部分用的基本上都是ArrayList、LinkedList、HashMap、HashSet或者TreeSet這幾個(gè)集合,你知道他們的最大容量,感興趣的可以了解一下2023-12-12SpringBoot項(xiàng)目實(shí)現(xiàn)短信發(fā)送接口開發(fā)的實(shí)踐
本文主要介紹了SpringBoot項(xiàng)目實(shí)現(xiàn)短信發(fā)送接口開發(fā)的實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10IDEA中如何查找jar包之間的依賴關(guān)系并忽略依賴的某個(gè)包
這篇文章主要介紹了IDEA中如何查找jar包之間的依賴關(guān)系并忽略依賴的某個(gè)包?本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08Java實(shí)現(xiàn)對(duì)一行英文進(jìn)行單詞提取功能示例
這篇文章主要介紹了Java實(shí)現(xiàn)對(duì)一行英文進(jìn)行單詞提取功能,結(jié)合實(shí)例形式分析了java基于StringTokenizer類進(jìn)行字符串分割的相關(guān)操作技巧,需要的朋友可以參考下2017-10-10Intellij IDEA 2018配置Java運(yùn)行環(huán)境的方法步驟
這篇文章主要介紹了Intellij IDEA 2018配置Java運(yùn)行環(huán)境的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09SpringCloud?分布式鎖的多種實(shí)現(xiàn)
本文主要介紹了SpringCloud?分布式鎖的多種實(shí)現(xiàn),主要有三種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04SpringBoot 導(dǎo)出數(shù)據(jù)生成excel文件返回方式
這篇文章主要介紹了SpringBoot 導(dǎo)出數(shù)據(jù)生成excel文件返回方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10