30個精簡程式碼的小技巧(第21-30個)
- 2019 年 10 月 6 日
- 筆記
接上一篇
21.將常量聲明為 STATIC FINAL
這樣在編譯運行時就可以把這些內容放入常量池中,避免運行期間計算生成常量的值。另外,將常量的名字進行大寫。
22.程式運行過程中避免使用反射
反射是java提供給用戶一個很強大的功能,但是功能強大效率卻不是很高。不建議在程式運行過程中頻繁是哦那個反射機制,特別是Method的invoke方法。如果確實必要,建議將那些需要通過反射載入的類在項目啟動的時候通過反射實例化出一個對象並放入記憶體。
23.使用資料庫連接池和執行緒池
這兩個池都是重用與對象的,前者可以避免頻繁打開和關閉連接,後者可以避免頻繁創建和銷毀執行緒。
24.使用帶緩衝的輸入,輸出流進行I/O操作
帶緩衝的輸入,輸出流即:
BufferedReader,bufferedWrite,BufferedInputStream,BufferedOutputStream它們可以大大提升I/O的效率。
25.順序插入和隨機訪問比較多的場景使用ArrayList,元素刪除和中間插入比較多的場景使用LinkedList理解這兩個集合有何不同即可。
26.不要讓public方法中有太多形參
public方法是對外提供的方法,如果給這些方法太多形參的話有兩點壞處:
(1) 違反面相對象的思想,java講究萬物皆對象,太多形參,和java編程思想不和
(2) 參數較多會導致出錯概率增加
27.字元串變數和字元串常量equals的時候將字元串常量寫在前面
如:
Strring str = "123"; if(str.equals("123")) { } 可以替換為: Strring str = "123"; if("123".equals(str)) { }
這麼做是為了避免空指針的出現
28.不要對數組使用toString()方法
本意是想列印數組裡的內容,卻可能因為數組引用對象為空而導致空指針異常。雖然對數組toString()沒有意義,但是對集合toString()是可以列印出集合中的內容的,因為集合的父類AbstractCollections重寫了Object的toString()方法。
29.不要對超出範圍的基本數據類型做向下強制轉換
得到的結果絕對是錯誤的。
30.把一個基本數據類型轉為字元串,對象點toString()是最快的方法,對象點valueOf(數據)次之,數據+""最慢
想把Integer i轉為字元串類型,有三種方式:
(1) i.toString()
(2) i.valueOf(i)
(3) i+""
下面測試
public static void main(String[] args) { int loopTime = 50000; Integer i = 0; long startTime = System.currentTimeMillis(); for(int j = 0 ;j < loopTime;j++) { String str = String.valueOf(i); } System.out.println("String.valueOf():"+(System.currentTimeMillis()-startTime) +"ms"); startTime = System.currentTimeMillis(); for(int j = 0;j < loopTime;j++) { String str = i.toString(); } System.out.println("Integer.toString():"+(System.currentTimeMillis()- startTime) +"ms"); startTime = System.currentTimeMillis(); for(int j = 0 ;j < loopTime;j++) { String str = i + ""; } System.out.println("i+"":"+(System.currentTimeMillis()- startTime)+"ms"); }
結果:
String.valueOf():11ms;
Integer.toString():5ms;
i + "":25ms;
原理是:
(1) String.valueOf()方法調用了Integer.toString()方法,但是在調用前先做了一次空判斷;
(2) Integer.toString()是直接調用;
(3) i + ""是使用了StringBuilder實現,先用了append方法拼接,在toString()獲取字元串