優(yōu)化java代碼
1.盡量使用static和final修飾符
對(duì)于一些固定的類和方法盡量使用static修飾符溺蕉,調(diào)用靜態(tài)方法的效率是最高的偎箫,而且可以減少空間占用明吩。
final修飾符有“無(wú)法改變”的含義蔑舞,final的變量值不可以修改拒担,final修飾的方法不可以被覆蓋,final的類無(wú)法被派生攻询。適當(dāng)?shù)氖褂胒inal修飾符不僅可以保護(hù)重要邏輯或者數(shù)據(jù)从撼,還可以提高程序的執(zhí)行效率。
2.盡量使用局部變量
調(diào)用方法邏輯是創(chuàng)建的局部變量 速度要靜態(tài)變量和示例變量要快許多
3.不要過(guò)度依賴GC
在短時(shí)間沒(méi)大量的創(chuàng)建對(duì)象又可能會(huì)消耗過(guò)多的系統(tǒng)內(nèi)存钧栖,從而導(dǎo)致內(nèi)存泄漏低零,我們要及時(shí)回收不再使用的對(duì)象和資源。
常見的回收方式實(shí)在變量或者對(duì)象使用完之后拯杠,將其手動(dòng)設(shè)為null
4.優(yōu)化循環(huán)語(yǔ)句
首先是要避免重復(fù)運(yùn)算
//錯(cuò)誤寫法
for(int i = 0; i < vector.size(); i++){
...
}
//正確寫法
int size=vector.size();
for(int i = 0; i < size; i++){
...
}
錯(cuò)誤寫法中vector對(duì)象的size方法在每次循環(huán)判斷中都會(huì)調(diào)用掏婶,雖然該方法執(zhí)行起來(lái)很快,但是疊加起來(lái)性能耗損是很可怕的潭陪。
其次雄妥,在循環(huán)邏輯中應(yīng)該避免使用一些開銷大的操作 如 創(chuàng)建對(duì)象
捕獲異常等。進(jìn)行邏輯計(jì)算時(shí)應(yīng)該盡量使用基本數(shù)據(jù)類型依溯,不如int 數(shù)組
string數(shù)組老厌。變量或?qū)ο笫褂煤笞⒁赓Y源回收
5.慎用異常機(jī)制
執(zhí)行異常捕獲語(yǔ)句(try catch)和拋出異常(throw)的代價(jià)很高。
使用異常機(jī)制盡量把捕獲邏輯放在最外層黎炉,并且只用于錯(cuò)誤處理枝秤,不要用于程序邏輯。
6.基本數(shù)字類型運(yùn)算
java語(yǔ)言中基本數(shù)字類型有 byte慷嗜,short淀弹,int丹壕,long,float垦页,double雀费,運(yùn)算方式有加干奢,減痊焊,乘,除忿峻,位移薄啥,布爾運(yùn)算
進(jìn)行計(jì)算邏輯需要注意:
- 運(yùn)算速度從快到慢依次是int,short逛尚,byte垄惧,long,double
- 除法比乘法慢太多绰寞,基本上除法的運(yùn)算時(shí)間是乘法的9倍
-long類型的計(jì)算很慢到逊,建議少用
-double運(yùn)算速度和float相當(dāng)
** 7.字符串操作使用StringBuffer提升效率 **
//低效寫法
String appendStr = "test";
int times = 10000;
String str = "";
for(int i = 0; i< times; i++){
str+=appendStr;
}
//高效寫法
Stirng appendStr = "test";
int times = 10000;
StringBuffer sb=new StringBuffer();
for(int i = 0; i< times; i++){
sb.append(appendStr);
}
8.合理使用數(shù)據(jù)集合
java的數(shù)據(jù)集合可分為兩種類型,即集合結(jié)構(gòu)(Collection)和圖表結(jié)構(gòu)(Map)滤钱,下面還包括了列表(List)觉壶,棧(Stack),散列(HashMap)等
Collection
|- List
| |- LinkedList (雙向鏈表)
| |- ArrayList (高級(jí)數(shù)組)
| |_ Vector (線程安全)
| |_ Stack
|_ Set
Map
|- Hashtable (線程安全)
|- HashMap
|_ WeakHashMap
其中最常使用的是ArrayList 件缸,該數(shù)據(jù)集合其實(shí)就是一個(gè)可變大小的數(shù)組铜靶,其次是LinkedList ,該集合用于實(shí)現(xiàn)棧(stack)他炊,隊(duì)列(queue)争剿,雙向隊(duì)列(deque)。Hashtable是同步的 線程安全 痊末。這些應(yīng)該盡量使用ArrayList和HashMap蚕苇,謹(jǐn)慎使用Vector和HashTable ,應(yīng)為后兩者為了保證線程安全而使用同步機(jī)制凿叠,系統(tǒng)開銷比較大
編碼時(shí)盡量使用原生的數(shù)據(jù)結(jié)構(gòu)如數(shù)組捆蜀,枚舉
9.使用clone替代new
//低效用法
public static Blog getNewBlog(){
return new Blog();
}
//高效用法
public static Blog baseBlog = new Blog();
public static Blog getNewBlog (){
return (Blog) baseBlog.clone();
}
10.慎用public static final
-如果一個(gè)變量或者數(shù)據(jù)被這樣聲明,那么我們就不能對(duì)這個(gè)變量進(jìn)行任何修改了幔嫂,這種數(shù)組也無(wú)法進(jìn)行增刪改查 以及排序等操作
-這種聲明的數(shù)據(jù)在整個(gè)進(jìn)程被銷毀之前都會(huì)常駐內(nèi)存辆它,使用不當(dāng)有可能會(huì)引起一些性能問(wèn)題。
11.采用對(duì)象池提高效率
創(chuàng)建和釋放對(duì)象會(huì)占用比較大的系統(tǒng)資源 即把常用的對(duì)象存放在一個(gè)對(duì)象池(對(duì)象集合)中履恩,通過(guò)一定的策略高效調(diào)用已經(jīng)存在的對(duì)象锰茉,避免大量的創(chuàng)建對(duì)象或銷毀對(duì)象
對(duì)象池 如數(shù)據(jù)庫(kù)連接池 線程池
12.不要過(guò)度使用OOP
善于使用語(yǔ)言中的工具類
使用Log打印日志的系統(tǒng)資源開銷也是不小的,在正式發(fā)布應(yīng)用之前應(yīng)該把程序中的Log調(diào)試代碼關(guān)閉