從緊張的工作中抽出來閒暇之餘學習鞏固下知識
豐富自己不斷提升。
1. Object的equals方法容易拋出空指針異常,應使用常量或確定有值的對象來調用equals方法。
正例:"test".equals(object);
反例:object.equlas("test");
說明:推薦使用java.util.Objects#equals(JDK7引入的工具類)
2. 不要在foreach循環裏進行元素的remove/add操作>,remove元素請使用Iterator方式,如果併發操作,需要對Iterator對象加鎖。
正例:
Iterator<String> it = a.iterator();
while (it.hasNext()) {
String temp = it.next();
if(刪除元素的條件) {
it.remove();
}
}
反例:
List<String> a = new ArrayList<String>();
a.add("1");
a.add("2");
for (String temp : a) {
if ("1".equals(temp)) {
a.remove(temp);
}
}
說明:試着執行以上代碼的結果。
3. 高度注意Map類集合K/V能不能存儲null的情況:
集合類 | Key | Value | Super | 說明 |
HashTable | 不允許爲null | 不允許爲null | Dictionary | 線程安全 |
ConcurrentHashMap | 不允許爲null | 不允許爲null | AbstractMap | 分段鎖技術 |
TreeMap | 不允許爲null | 允許爲null | AbstractMap | 線程不安全 |
HashMap | 允許爲null | 允許爲null | AbstractMap | 線程不安全 |
反例:由於HashMap的干擾,很多人認爲ConcurrentHashMap是可以置入null值,而事實上存儲
null值時會拋出NPE異常。
4. 線程資源必須通過線程池提供,不允許在應用中自行顯式創建線程
說明:使用線程的好處是減少在創建和銷燬線程上所花的時間以及系統資源的開銷,解決資源不足的問題。
如果不使用線程池,有可能造成系統創建大量同類線程而導致消耗完內存或着“過度切換”的問題。
5. 線程池不允許用Executors去創建,而是通過ThreadPoolExecutor的方式,這樣的處理方式讓寫的同學更
加明確線程池的運行規則,規避資源耗盡的風險。
說明:
1)FixedThreadPool和SingleThreadPool:
允許的請求隊列長度爲Integer.MAX_VALUE,可能會堆積大量的請求,從而導致OOM(內存溢出)。
2)CacheThreadPool和ScheduledThreadPool:
允許的創建線程數量爲Integer.MAX_VALUE,可能會創建大量的線程,從而導致OOM。
6. 表達異常分支時,少用if-else語句,這種方式可以改成:
if (condition) {
...
return obj;
}
//接着寫else的業務邏輯代碼
說明:如果非要使用if()...else if()...else...方式表達邏輯,避免後續代碼維護困難,請勿超過3層。
正例:邏輯上超過3層的if-else代碼可以使用衛語句,或狀態模式來實現。衛語句示例:
public void today() {
if (isBusy) {
System.out.println("change time.");
return;
}
if (isFree()) {
System.out.println("go to travel.");
return;
}
System.out.println("stay at home to learn Alibaba Java Coding Guideline");
return;
}
7. 循環體中的語句要考量性能,以下操作儘量移至循環體外處理,如定義對象、變量、獲取數據庫連接,進行不必要的try-catch操作
(這個try-catch是否可以移至循環體外)。