隨著工作經驗的積累,在程式碼編寫和優化方面,個人的心得體會總結以及有些從網上或書本中看到的有用技巧
1. 判斷何時使用keySet()和entrySet() 獲取Map 的key 和value
當迴圈中只獲取key時,使用keySet()是更正確的做法。而使用entrySet(),當既獲取key,又獲取value時,使用entrySet();或者需要主鍵key去取value時,迭代entrySet()才是更高效的做法。其比先迭代keySet()獲取key後再通過get取值更佳:
反例:
Map<String, Integer> testMap = new HashMap<>(); testMap.put("a", 1); for (String keyStr : testMap.keySet()) { Integer value = testMap.get(keyStr); }
正例:
Map<String, Integer> testMap = new HashMap<>(); testMap.put("a", 1); for (Map.Entry<String, Integer> keyVal : testMap.entrySet()) { String key = keyVal.getKey(); Integer value = keyVal.getValue(); }
2. 針對程式碼中,過多的if ... else ..判斷,如何優化減少if else呢?(非常重要的優化技巧)
具體請看部落格:https://www.cnblogs.com/sun-flower1314/p/15097977.html
3. 初始化集合時儘量指定其大小
這樣可以減少擴容的次數,耗費時間和效能,(至於為何要這樣呢?請檢視第9條)
反例:
String[] testArr = new String[]{"a", "b", "c", "d"}; List<String> testList = new ArrayList<>(); for (String str : testArr) { testList.add(str); }
正例:
String[] testArr = new String[]{"a", "b", "c", "d"}; List<String> testList = new ArrayList<>(testArr.length); for (String str : testArr) { testList.add(str); }
4. 字串拼接優化
字串在拼接過長中,一般編譯器會將程式碼優化,但是在迴圈中,不會進行優化,所以可以使用StringBuilder進行替換
5.對於未使用的區域性變數、欄位,要刪除
對於在方法中定義的區域性變數、欄位,如果沒有使用,最好刪除。第一是程式碼簡潔,第二專案載入有影響,影響效率。
6.工具類中遮蔽掉未使用的建構函式
一般每個類,沒有定義構造方法的情況下,都會有一個隱式的無參建構函式,應該顯示的定義私有建構函式來遮蔽該函式。
7.其他型別轉化為字串
在將其他其他型別轉化為字串時,避免使用【"" + val】,而應該採用【String.valueOf(val)】 ,效率更高。
8.避免使用new BigDecimal(double)
在資料精度要求較高或數值比較的情境下,使用new BigDecimal(double)時,存在精度損失導致不正確的情況,應該使用 BigDecimal.valueOf(double)
反例:
double a = 1.2345611; BigDecimal bigDecimal = new BigDecimal(a); System.out.println("new BigDecimal(double) 結果:" + bigDecimal);
控制檯列印:
new BigDecimal(double) 結果:1.234561100000000077869799497420899569988250732421875
正例:
double b = 1.2345611; BigDecimal bigDecimal2 = BigDecimal.valueOf(b); System.out.println("BigDecimal.valueOf(double)結果為:" + bigDecimal2);
控制檯列印:
BigDecimal.valueOf(double)結果為:1.2345611
9.對於集合和陣列為空的處理
經常看到程式碼中,對於查詢到的資料集為空時,有的返回null,有的返回空。
①返回null有可能會產生問題:若呼叫方未檢測null,則會拋空指標異常,存在隱藏的問題。
②返回空時,能有效避免因呼叫方未檢測null而丟擲空指標異常的情況,還可以刪除呼叫方檢測null的語句使程式碼更簡潔。
反例:
public static String[] getResultArr() { return null; } public static List<String> getResultList() { return null; } public static Map<String, Object> getResultMap() { return null; }
正例:
public static String[] getResultArr() { return new String[0]; } public static List<String> getResultList() { return Collections.emptyList(); } public static Map<String, Object> getResultMap() { return Collections.emptyMap(); }
10.優先使用常量或確定值呼叫equals或其他方法
物件的equals 方法容易拋空指標異常,應使用常量或確定有值的物件來呼叫equals 方法。
---未完待續,不斷積累中...