JAVA性能提升的幾個細節

1、儘量指定類、方法的final修飾符

2、儘量重用對象:出現字符串連接時應該使用StringBuilder/StringBuffer代替

3、儘可能使用局部變量

4、及時關閉流

5、儘量減少對變量的重複計算

for (int i = 0, length = list.size(); i < length; i++)
{...}

6、儘量採用懶加載的策略,即在需要的時候才創建

7、慎用異常

8、不要在循環中使用try…catch…,應該把其放在最外層

9、如果能估計到待添加的內容長度,爲底層以數組方式實現的集合、工具類指定初始長度

10、當複製大量數據時,使用System.arraycopy()命令

11、乘法和除法使用移位操作

for (val = 0; val < 100000; val += 5)
{
	a = val << 3; //×8
	b = val >> 1; //÷2
}

12、循環內不要不斷創建對象引用

Object obj = null;for (int i = 0; i <= count; i++) { obj = new Object(); }

13、基於效率和類型檢查的考慮,應該儘可能使用array,無法確定數組大小時才使用ArrayList,儘量使用HashMap、ArrayList、StringBuilder,除非線程安全需要,否則不推薦使用Hashtable、Vector、StringBuffer,後三者由於使用同步機制而導致了性能開銷

15、不要將數組聲明爲public static final,將數組聲明爲public更是一個安全漏洞,這意味着這個數組可以被外部類所改變

16、儘量在合適的場合使用單例,使用單例可以減輕加載的負擔、縮短加載的時間、提高加載的效率,但並不是所有地方都適用於單例,簡單來說,單例主要適用於以下三個方面:

(1)控制資源的使用,通過線程同步來控制資源的併發訪問

(2)控制實例的產生,以達到節約資源的目的

(3)控制數據的共享,在不建立直接關聯的條件下,讓多個不相關的進程或線程之間實現通信

17、儘量避免隨意使用靜態變量

18、及時清除不再需要的會話

19、實現RandomAccess接口的集合比如ArrayList,應當使用最普通的for循環而不是foreach循環來遍歷

if (list instanceof RandomAccess)
{ for (int i = 0; i < list.size(); i++){}
}else{
	Iterator<?> iterator = list.iterable(); 
	while (iterator.hasNext()){iterator.next()}
}

20、使用同步代碼塊替代同步方法

21、將常量聲明爲static final,並以大寫命名

22、不要創建一些不使用的對象,不要導入一些不使用的類

23、程序運行過程中避免使用反射

24、使用數據庫連接池和線程池

25、使用帶緩衝的輸入輸出流進行IO操作

26、順序插入和隨機訪問比較多的場景使用ArrayList,元素刪除和中間插入比較多的場景使用LinkedList

27、不要讓public方法中有太多的形參,public方法即對外提供的方法,如果給這些方法太多形參的話主要有兩點壞處:

(1)違反了面向對象的編程思想,Java講求一切都是對象,太多的形參,和麪向對象的編程思想並不契合

(2)參數太多勢必導致方法調用的出錯概率增加,至於這個”太多”指的是多少個,3、4個吧。比如我們用JDBC寫一個insertStudentInfo方法,有10個學生信息字段要插入Student表中,可以把這10個參數封裝在一個實體類中,作爲insert方法的形參。

28、字符串變量和字符串常量equals的時候將字符串常量寫在前面

29、不要對數組使用toString()方法

30、不要對超出範圍的基本數據類型做向下強制轉型

31、公用的集合類(也就是說不是方法裏面的屬性)中不使用的數據一定要及時remove掉

32、把一個基本數據類型轉爲字符串,基本數據類型.toString()是最快的方式、String.valueOf(數據)次之、數據+””最慢

33、遍歷Map的方式有很多,通常場景下我們需要的是遍歷Map中的Key和Value,那麼推薦使用的、效率最高的方式是:

HashMap<String, String> hm = new HashMap<String, String>();
hm.put("111", "222");
Set<Map.Entry<String, String>> entrySet = hm.entrySet();
Iterator<Map.Entry<String, String>> iter = entrySet.iterator();
while (iter.hasNext())
{
	Map.Entry<String, String> entry = iter.next();
	System.out.println(entry.getKey() + "\t" + entry.getValue());
}
//如果你只是想遍歷一下這個Map的key值,那用”Set keySet = hm.keySet();”會比較合適一些

34、對資源的close()建議分開操作

注意事項:

1、不用的方法加過期註解@Deprecated

2、儘量不要使用Byte

3、增刪改的操作必須有事務處理註解@Transactional

4、接口->實現類,如果實現類中調用該接口的其他實現方法,需要使用如下方式

final A service = (A) AopContext.currentProxy();

以上內容參考公衆號《我是程序汪》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章