Tips:關注公衆號:松花皮蛋的黑板報,領取程序員月薪25K+祕籍,進軍BAT必備!
程序員
當循環中只須要獲取Map 的主鍵key時,迭代keySet() 是正確的;可是,當須要主鍵key 和取值value 時,迭代entrySet() 纔是更高效的作法,其比先迭代keySet() 後再去經過get 取值性能更佳。正則表達式
反例:數組
正例:微信
使用Collection.size() 來檢測是否爲空在邏輯上沒有問題,可是使用Collection.isEmpty() 使得代碼更易讀,而且能夠得到更好的性能;除此以外,任何Collection.isEmpty() 實現的時間複雜度都是O(1) ,不須要屢次循環遍歷,可是某些經過Collection.size() 方法實現的時間複雜度多是O(n)函數
反例:工具
正例:性能
儘可能在初始化時指定集合的大小,能有效減小集合的擴容次數,由於集合每次擴容的時間複雜度極可能時O(n),耗費時間和性能。優化
反例:ui
正例:3d
通常的字符串拼接在編譯期Java 會對其進行優化,可是在循環中字符串的拼接Java 編譯期沒法執行優化,因此須要使用StringBuilder 進行替換。
反例:
正例:
在Java 集合類庫中,List的contains 方法廣泛時間複雜度爲O(n),若代碼中須要頻繁調用contains 方法查找數據則先將集合list 轉換成HashSet 實現,將O(n) 的時間複雜度將爲O(1)。
反例:
正例:
對於集合類型的靜態成員變量,應該使用靜態代碼塊賦值,而不是使用集合實現來賦值。
反例:
正例:
工具類是一堆靜態字段和函數的集合,其不該該被實例化;可是,Java 爲每一個沒有明肯定義構造函數的類添加了一個隱式公有構造函數,爲了不沒必要要的實例化,應該顯式定義私有構造函數來屏蔽這個隱式公有構造函數。
反例:
正例:
用catch 語句捕獲異常後,若什麼也不進行處理,就只是讓異常從新拋出,這跟不捕獲異常的效果同樣,能夠刪除這塊代碼或添加別的處理。
反例:
正例:
把其它對象或類型轉化爲字符串時,使用String.valueOf(value) 比 ""+value 的效率更高。
反例:
正例:
BigDecimal(double) 存在精度損失風險,在精確計算或值比較的場景中可能會致使業務邏輯異常。
反例:
正例:
若程序運行返回null,須要調用方強制檢測null,不然就會拋出空指針異常;返回空數組或空集合,有效地避免了調用方由於未檢測null 而拋出空指針異常的狀況,還能夠刪除調用方檢測null 的語句使代碼更簡潔。
反例:
正例:
對象的equals 方法容易拋空指針異常,應使用常量或肯定有值的對象來調用equals 方法。
反例:
正例:
枚舉一般被當作常量使用,若是枚舉中存在公共屬性字段或設置字段方法,那麼這些枚舉常量的屬性很容易被修改;理想狀況下,枚舉中的屬性字段是私有的,並在私有構造函數中賦值,沒有對應的Setter 方法,最好加上final 修飾符。
反例:
正例:
使用字符串String 的plit 方法時,傳入的分隔字符串是正則表達式,則部分關鍵字(好比 .[]()| 等)須要轉義。
反例:
正例:
文章來源:www.liangsonghua.me
關注微信公衆號:松花皮蛋的黑板報,獲取更多精彩!
公衆號介紹:分享在京東工做的技術感悟,還有JAVA技術和業內最佳實踐,大部分都是務實的、能看懂的、可復現的