Java編程代碼性能優(yōu)化
一、咱們之所以這么干的目的:
1.效率(最重要)
2.可讀性,便于后期維護(hù)。(同樣很重要)
二、代碼優(yōu)化的要求:
1.減小代碼的體積。
2.提高代碼的運行效率。
三、常用的代碼的優(yōu)化:
1、盡量重用對象 :
特別是String對象的重用。最常用的就是字符串的拼接:
當(dāng)遇到頻繁擦拼接String時。記住一定用StringBuilder/StringBuffer
例如:
ArrayList<String> list;
//省去list初始化。
StringBuilder builder = new StringBuilder();
for (String s : list) {
builder.append(s);
}
String result = builder.toString();
原因:Java虛擬機(jī)不僅要花時間生成對象,而且還要花時間處理和回收對象,生成過多對象必定會給程序性能帶來影響。
2. 盡可能使用局部變量 :
局部變量在棧中創(chuàng)建,創(chuàng)建速度快,用完即自動消失,不需要額外的垃圾回收。
而靜態(tài)變量、實例變量等在堆中創(chuàng)建,創(chuàng)建速度慢,同時還依賴Java垃圾回收機(jī)制處理。
3. 及時關(guān)閉流 :
Java程序開發(fā)中,在對I/O,數(shù)據(jù)庫操作結(jié)束后,一定要記住關(guān)閉流。
原因:未關(guān)閉流會對系統(tǒng)造成很大的開銷,甚至?xí)?shù)據(jù)造成嚴(yán)重的后果。
4. 使用懶加載
懶加載 : 當(dāng)要用的時候才創(chuàng)建該對象。
例如:
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不宜太大。
不要將無用代碼,即不會拋出異常的代碼統(tǒng)統(tǒng)放入try...catch塊中,減小try...catch代碼塊的大小。
保證代碼的可讀性,易維護(hù)性,健壯性。
7.循環(huán)內(nèi)盡量避免創(chuàng)建對象的引用。
尤其是循環(huán)量大的時候。
while (i<1000) {
Object object = new Object();
}
建議修改為:
Object object = null;
while (i<1000) {
object = new Object();
每次new Object()的時候,Object對象引用指向Object對象。
當(dāng)循環(huán)次數(shù)多的時候,如第一種,JVM會創(chuàng)建1000個對象的引用,而第二種內(nèi)存中只有一份Object對象引用。這樣就大大節(jié)省了內(nèi)存空間了。
8.不要隨意使用static變量。
當(dāng)對象被聲明為static的變量所引用時,此時,Java垃圾回收器不會清理這個對象所占用的堆內(nèi)存。
靜態(tài)變量所占用的堆內(nèi)存直到該變量所在類所在程序結(jié)束才被釋放。 即靜態(tài)變量生命周期=類生命周期。
9.不要創(chuàng)建一些不使用的對象,不要導(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);
}
//上下對比
//keySet()
for (String key : map.keySet()) {
String value = map.get(key);
System.out.println(key + " : " + value);
}
13.關(guān)于Iterator與forEach()的集合遍歷舍取。
算法導(dǎo)論上說:算法是為了提高空間效率和時間效率。但往往時間和空間不能并存。
時間效率: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);
}
對比:
//forEach()
for (Entry<String, String> entry : map.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + " : " + value);
}
個人認(rèn)為:當(dāng)處理大數(shù)據(jù)時推薦使用Iterator遍歷集合。
但處理小數(shù)據(jù)的話,為了可讀性和后期維護(hù)還是使用forEach()。
兩者結(jié)合使用,都應(yīng)該掌握。
相關(guān)文章
SpringBoot整合Lucene實現(xiàn)全文檢索的詳細(xì)步驟
全文搜索(Full-Text?Search)是指對大規(guī)模存儲在計算機(jī)系統(tǒng)中的文本數(shù)據(jù)進(jìn)行檢索和匹配的技術(shù),它允許用戶輸入關(guān)鍵字,然后從海量的文本數(shù)據(jù)中快速找到相關(guān)的信息,本文介紹了SpringBoot整合Lucene實現(xiàn)全文檢索的詳細(xì)步驟,需要的朋友可以參考下2024-03-03
詳解JFX11+IDEA跨平臺打包發(fā)布的完美解決辦法
這篇文章主要介紹了詳解JFX11+IDEA跨平臺打包發(fā)布的完美解決辦法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
IntelliJ IDEA 小技巧之Bookmark(書簽)的使用
這篇文章主要介紹了IntelliJ IDEA 小技巧之Bookmark(書簽)的使用,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
SpringBoot實現(xiàn)異步任務(wù)的項目實踐
本文將使用SpringBoot 去實現(xiàn)異步之間的調(diào)用,提高系統(tǒng)的并發(fā)性能、用戶體驗,具有一定的參考價值,感興趣的可以了解一下2023-10-10
Java中使用jaxp進(jìn)行sax解析_動力節(jié)點Java學(xué)院整理
使用SAX的優(yōu)勢在于其解析速度較快,相對于DOM而言占用內(nèi)存較少。這篇文章主要介紹了Java中使用jaxp進(jìn)行sax解析,需要的朋友可以參考下2017-08-08
SpringBoot集成FTP文件服務(wù)器簡單應(yīng)用方式
這篇文章主要介紹了SpringBoot集成FTP文件服務(wù)器簡單應(yīng)用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
SpringBoot自動配置@EnableAutoConfiguration過程示例
這篇文章主要為大家介紹了SpringBoot自動配置@EnableAutoConfiguration的過程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10

