這樣規範寫代碼,同事直呼「666」

面試精選集,快快前往領取吧!offer.liangsonghua.me/。關注微信公衆號:松花皮蛋的黑板報,獲取更多精彩!
web

1、迭代entrySet() 獲取Map 的key 和value

當循環中只須要獲取Map 的主鍵key時,迭代keySet() 是正確的;可是,當須要主鍵key 和取值value 時,迭代entrySet() 纔是更高效的作法,其比先迭代keySet() 後再去經過get 取值性能更佳。

反例:面試

正例:正則表達式

2、使用Collection.isEmpty() 檢測空

使用Collection.size() 來檢測是否爲空在邏輯上沒有問題,可是使用Collection.isEmpty() 使得代碼更易讀,而且能夠得到更好的性能;除此以外,任何Collection.isEmpty() 實現的時間複雜度都是O(1) ,不須要屢次循環遍歷,可是某些經過Collection.size() 方法實現的時間複雜度多是O(n)

反例:數組

正例:微信

3、初始化集合時儘可能指定其大小

儘可能在初始化時指定集合的大小,能有效減小集合的擴容次數,由於集合每次擴容的時間複雜度極可能時O(n),耗費時間和性能。

反例:架構

正例:函數

4、使用StringBuilder 拼接字符串

通常的字符串拼接在編譯期Java 會對其進行優化,可是在循環中字符串的拼接Java 編譯期沒法執行優化,因此須要使用StringBuilder 進行替換。

反例:微服務

正例:工具

5、若需頻繁調用Collection.contains 方法則使用Set

在Java 集合類庫中,List的contains 方法廣泛時間複雜度爲O(n),若代碼中須要頻繁調用contains 方法查找數據則先將集合list 轉換成HashSet 實現,將O(n) 的時間複雜度將爲O(1)。

反例:性能

正例:

6、使用靜態代碼塊實現賦值靜態成員變量

對於集合類型的靜態成員變量,應該使用靜態代碼塊賦值,而不是使用集合實現來賦值。

反例:

正例:

7、刪除未使用的局部變量、方法參數、私有方法、字段和多餘的括號。

9、工具類中屏蔽構造函數

工具類是一堆靜態字段和函數的集合,其不該該被實例化;可是,Java 爲每一個沒有明肯定義構造函數的類添加了一個隱式公有構造函數,爲了不沒必要要的實例化,應該顯式定義私有構造函數來屏蔽這個隱式公有構造函數。

反例:

正例:

10、刪除多餘的異常捕獲並跑出

用catch 語句捕獲異常後,若什麼也不進行處理,就只是讓異常從新拋出,這跟不捕獲異常的效果同樣,能夠刪除這塊代碼或添加別的處理。

反例:

正例:

11、字符串轉化使用String.valueOf(value) 代替 " " + value

把其它對象或類型轉化爲字符串時,使用String.valueOf(value) 比 ""+value 的效率更高。

反例:

正例:

12、避免使用BigDecimal(double)

BigDecimal(double) 存在精度損失風險,在精確計算或值比較的場景中可能會致使業務邏輯異常。

反例:

正例:

十3、返回空數組和集合而非 null

若程序運行返回null,須要調用方強制檢測null,不然就會拋出空指針異常;返回空數組或空集合,有效地避免了調用方由於未檢測null 而拋出空指針異常的狀況,還能夠刪除調用方檢測null 的語句使代碼更簡潔。

反例:

正例:

十4、優先使用常量或肯定值調用equals 方法

對象的equals 方法容易拋空指針異常,應使用常量或肯定有值的對象來調用equals 方法。

反例:

正例:

十5、枚舉的屬性字段必須是私有且不可變

枚舉一般被當作常量使用,若是枚舉中存在公共屬性字段或設置字段方法,那麼這些枚舉常量的屬性很容易被修改;理想狀況下,枚舉中的屬性字段是私有的,並在私有構造函數中賦值,沒有對應的Setter 方法,最好加上final 修飾符。

反例:

正例:

十6、tring.split(String regex)部分關鍵字須要轉譯

使用字符串String 的plit 方法時,傳入的分隔字符串是正則表達式,則部分關鍵字(好比 .[]()| 等)須要轉義。

反例:

正例:

文章來源:www.liangsonghua.me

做者介紹:京東資深工程師-梁鬆華,在穩定性保障、敏捷開發、JAVA高級、微服務架構方面有深刻的理解

關注微信公衆號:松花皮蛋的黑板報,獲取更多精彩!

相關文章
相關標籤/搜索