1、盡量不要使用static、final修飾符和局部變量
final修飾符修飾的變量值不可以修改,修飾的方法不可以被復(fù)寫,修飾的類不可以被繼承。適當(dāng)?shù)氖褂胒inal修飾符不僅可以保護(hù)重要邏輯和數(shù)據(jù),還可以提高程序的執(zhí)行效率。
2、不要過度依賴GC
內(nèi)存抖動是指在短時間內(nèi)有大量的對象被創(chuàng)建或者被回收的現(xiàn)象。內(nèi)存抖動常出現(xiàn)的原因是頻繁的在循環(huán)中創(chuàng)建對象,如果這種抖動很是頻繁,會導(dǎo)致垃圾回收機(jī)制的頻繁運(yùn)行。
內(nèi)存泄漏是指某段內(nèi)存在程序功能上已經(jīng)不再需要了,但是垃圾回收機(jī)制在回收內(nèi)存時檢測那段內(nèi)存還是被需要的,不能被回收,這種在程序中沒有被使用但是又不能被回收的內(nèi)存就是泄漏的內(nèi)存。內(nèi)存泄漏會導(dǎo)致一些內(nèi)存沒法被正常利用,可用內(nèi)存減少,輕則增加垃圾回收機(jī)制運(yùn)行頻率,重則內(nèi)存溢出(當(dāng)系統(tǒng)需要分配一段內(nèi)存,但現(xiàn)有內(nèi)存在垃圾回收運(yùn)行之后仍然不足,就會內(nèi)溢出)
常見的優(yōu)化方式是在變量或?qū)ο笫褂猛曛螅瑢⑵涫謩又每铡?/p>
3、優(yōu)化循環(huán)語句
-
避免重復(fù)運(yù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)建對象、捕獲異常等需要大塊內(nèi)存消耗的操作。解決方案是在進(jìn)行邏輯計算時應(yīng)該盡量使用基本數(shù)據(jù)類型,比如int數(shù)組,string數(shù)組等,變量或?qū)ο笫褂煤笞⒁赓Y源回收。
4、慎用異常機(jī)制
執(zhí)行異常捕獲語句(try catch)和拋出異常(throw)的代價很高。使用異常機(jī)制盡量把邏輯放在最外層,并且只用于錯誤處理,不要用于程序邏輯。
5、基本數(shù)據(jù)類型運(yùn)算
java中的基本數(shù)據(jù)類型有byte、short、int、long、float、double、boolean、char,運(yùn)算方式有加減乘除、位移、布爾運(yùn)算。
進(jìn)行邏輯運(yùn)算時需要注意:
- 運(yùn)算速度從快到慢依次是int>short>byte>long>double
- 除法比乘法要慢很多,基本上除法的運(yùn)算時間是乘法的9倍
- long類型的運(yùn)算很慢,建議少用
- double運(yùn)算速度和float相當(dāng)
6、字符串操作使用StringBuffer提升效率
//低效寫法
String appendStr = "test";
int time = 10000;
str = "";
for(i = 0; i <= time; i++){
str += appendStr;
}
//高效寫法
String appendStr = "test";
int time = 10000;
StringBuffer sb = new StringBuffer();
for(i = 0; i <= time; i++){
sb.append(appendStr);
}
7、合理使用數(shù)據(jù)集合
java的數(shù)據(jù)集合可分為兩種類型,即集合結(jié)構(gòu)(Collection)和圖表結(jié)構(gòu)(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是同步的 線程安全 。這些應(yīng)該盡量使用ArrayList和HashMap,謹(jǐn)慎使用Vector和HashTable ,應(yīng)為后兩者為了保證線程安全而使用同步機(jī)制,系統(tǒng)開銷比較大
編碼時盡量使用原生的數(shù)據(jù)結(jié)構(gòu)如數(shù)組,枚舉
8、慎用public static final
- 如果一個變量或者數(shù)據(jù)被這樣聲明,那么我們就不能對這個變量進(jìn)行任何修改了,這種數(shù)組也無法進(jìn)行增刪改查 以及排序等操作
- 這種聲明的數(shù)據(jù)在整個進(jìn)程被銷毀之前都會常駐內(nèi)存,使用不當(dāng)有可能會引起一些性能問題。
9、使用對象池提高效率
創(chuàng)建和釋放對象會占用比較大的系統(tǒng)資源 即把常用的對象存放在一個對象池(對象集合)中,通過一定的策略高效調(diào)用已經(jīng)存在的對象,避免大量的創(chuàng)建對象或銷毀對象對象池 如數(shù)據(jù)庫連接池 線程池
10、不要過度使用OOP
善于使用語言中的工具類
使用Log打印日志的系統(tǒng)資源開銷也是不小的,在正式發(fā)布應(yīng)用之前應(yīng)該把程序中的Log調(diào)試代碼關(guān)閉