優(yōu)化java代碼
1.盡量使用static和final修飾符
對于一些固定的類和方法盡量使用static修飾符,調(diào)用靜態(tài)方法的效率是最高的,而且可以減少空間占用。
final修飾符有“無法改變”的含義,final的變量值不可以修改,final修飾的方法不可以被覆蓋,final的類無法被派生。適當?shù)氖褂胒inal修飾符不僅可以保護重要邏輯或者數(shù)據(jù),還可以提高程序的執(zhí)行效率。
2.盡量使用局部變量
調(diào)用方法邏輯是創(chuàng)建的局部變量 速度要靜態(tài)變量和示例變量要快許多
3.不要過度依賴GC
在短時間沒大量的創(chuàng)建對象又可能會消耗過多的系統(tǒng)內(nèi)存,從而導致內(nèi)存泄漏,我們要及時回收不再使用的對象和資源。
常見的回收方式實在變量或者對象使用完之后,將其手動設為null
4.優(yōu)化循環(huán)語句
首先是要避免重復運算
//錯誤寫法
for(int i = 0; i < vector.size(); i++){
...
}
//正確寫法
int size=vector.size();
for(int i = 0; i < size; i++){
...
}
錯誤寫法中vector對象的size方法在每次循環(huán)判斷中都會調(diào)用,雖然該方法執(zhí)行起來很快,但是疊加起來性能耗損是很可怕的。
其次,在循環(huán)邏輯中應該避免使用一些開銷大的操作 如 創(chuàng)建對象
捕獲異常等。進行邏輯計算時應該盡量使用基本數(shù)據(jù)類型,不如int 數(shù)組
string數(shù)組。變量或?qū)ο笫褂煤笞⒁赓Y源回收
5.慎用異常機制
執(zhí)行異常捕獲語句(try catch)和拋出異常(throw)的代價很高。
使用異常機制盡量把捕獲邏輯放在最外層,并且只用于錯誤處理,不要用于程序邏輯。
6.基本數(shù)字類型運算
java語言中基本數(shù)字類型有 byte,short,int,long,float,double,運算方式有加,減,乘,除,位移,布爾運算
進行計算邏輯需要注意:
- 運算速度從快到慢依次是int,short,byte,long,double
- 除法比乘法慢太多,基本上除法的運算時間是乘法的9倍
-long類型的計算很慢,建議少用
-double運算速度和float相當
** 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é)構(Collection)和圖表結(jié)構(Map),下面還包括了列表(List),棧(Stack),散列(HashMap)等
Collection
|- List
| |- LinkedList (雙向鏈表)
| |- ArrayList (高級數(shù)組)
| |_ Vector (線程安全)
| |_ Stack
|_ Set
Map
|- Hashtable (線程安全)
|- HashMap
|_ WeakHashMap
其中最常使用的是ArrayList ,該數(shù)據(jù)集合其實就是一個可變大小的數(shù)組,其次是LinkedList ,該集合用于實現(xiàn)棧(stack),隊列(queue),雙向隊列(deque)。Hashtable是同步的 線程安全 。這些應該盡量使用ArrayList和HashMap,謹慎使用Vector和HashTable ,應為后兩者為了保證線程安全而使用同步機制,系統(tǒng)開銷比較大
編碼時盡量使用原生的數(shù)據(jù)結(jié)構如數(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
-如果一個變量或者數(shù)據(jù)被這樣聲明,那么我們就不能對這個變量進行任何修改了,這種數(shù)組也無法進行增刪改查 以及排序等操作
-這種聲明的數(shù)據(jù)在整個進程被銷毀之前都會常駐內(nèi)存,使用不當有可能會引起一些性能問題。
11.采用對象池提高效率
創(chuàng)建和釋放對象會占用比較大的系統(tǒng)資源 即把常用的對象存放在一個對象池(對象集合)中,通過一定的策略高效調(diào)用已經(jīng)存在的對象,避免大量的創(chuàng)建對象或銷毀對象
對象池 如數(shù)據(jù)庫連接池 線程池
12.不要過度使用OOP
善于使用語言中的工具類
使用Log打印日志的系統(tǒng)資源開銷也是不小的,在正式發(fā)布應用之前應該把程序中的Log調(diào)試代碼關閉