如何編寫高效代碼?這是每個研發團隊都面臨的一個重大問題。《阿里Java高效代碼50例》(實際54例)來源於實際經驗,幫助我們成爲編寫高效代碼的軟件工程師。
類別 | 要點 |
常量&變量 | 直接賦值常量值,禁止聲明新對象 |
當成員變量值無需改變時,儘量定義爲靜態常量 | |
儘量使用基本數據類型,避免自動裝箱和拆箱 | |
如果變量的初值會被覆蓋,就沒有必要給變量賦初值 | |
儘量使用函數內的基本類型臨時變量 | |
儘量不要在循環體外定義變量 | |
不可變的靜態常量,儘量使用非線程安全類 | |
不可變的成員變量,儘量使用非線程安全類 | |
對象&類 | 禁止使用JSON轉化對象 |
儘量不使用反射賦值對象 | |
採用Lambda表達式替換內部匿名類 | |
儘量避免定義不必要的子類 | |
儘量指定類的final修飾符 | |
方法 | 把跟類成員變量無關的方法聲明成靜態方法 |
儘量使用基本數據類型作爲方法參數類型,避免不必要的裝箱、拆箱和空指針判斷 | |
儘量使用基本數據類型作爲方法返回值類型,避免不必要的裝箱、拆箱和空指針判斷 | |
協議方法參數值非空,避免不必要的空指針判斷 | |
協議方法返回值非空,避免不必要的空指針判斷 | |
被調用方法已支持判空處理,調用方法無需再進行判空處理 | |
儘量避免不必要的函數封裝 | |
儘量指定方法的final修飾符 | |
表達式 | 儘量減少方法的重複調用 |
儘量避免不必要的方法調用 | |
儘量使用移位來代替正整數乘除 | |
提取公共表達式,避免重複計算 | |
儘量不在條件表達式中用!取反 | |
對於多常量選擇分支,儘量使用switch語句而不是if-else語句 | |
字符串 | 儘量不要使用正則表達式匹配 |
儘量使用字符替換字符串 | |
儘量使用StringBuilder進行字符串拼接 | |
不要使用""+轉化字符串 | |
數組 | 不要使用循環拷貝數組,儘量使用System.arraycopy拷貝數組 |
集合轉化爲類型T數組時,儘量傳入空數組T[0] | |
集合轉化爲Object數組時,儘量使用toArray()方法 | |
集合 | 初始化集合時,儘量指定集合大小 |
不要使用循環拷貝集合,儘量使用JDK提供的方法拷貝集合 | |
儘量使用Arrays.asList轉化數組爲列表 | |
直接迭代需要使用的集合 | |
不要使用size方法檢測空,必須使用isEmpty方法檢測空 | |
非隨機訪問的List,儘量使用迭代代替隨機訪問 | |
儘量使用HashSet判斷值存在 | |
避免先判斷存在再進行獲取 | |
異常 | 直接捕獲對應的異常 |
儘量避免在循環中捕獲異常 | |
禁止使用異常控制業務流程 | |
緩衝區 | 初始化時儘量指定緩衝區大小 |
儘量重複使用同一緩衝區 | |
儘量設計使用同一緩衝區 | |
儘量使用緩衝流減少IO操作 | |
線程 | 在單線程中,儘量使用非線程安全類 |
在多線程中,儘量使用線程安全類 | |
儘量減少同步代碼塊範圍 | |
儘量合併爲同一同步代碼塊 | |
儘量使用線程池減少線程開銷 |
示例代碼,詳見原文:https://blog.51cto.com/13851865/2462569