首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

《編寫高質量代碼》Java 集合框架最佳實踐:建議 79-82 深度解析

     編輯:Java 綜合教學

建議 79:集合中哈希碼不要重復

HashMap 通過 hashCode() & (n-1) 定位桶位,哈希碼衝突會退化為鏈表遍歷,性能逼近 ArrayList。重寫 hashCode() 必須分散均勻,避免返回常量。

// 反例:所有對象哈希碼相同
@Override public int hashCode() { return 42; }

// 正例:結合業務字段
@Override public int hashCode() {
    return Objects.hash(id, name, dept);
}

建議 80:多線程環境優先用並發包而非 Vector/Hashtable

Vector、Hashtable 方法級 synchronized 粒度過粗,且無法解決複合操作原子性(如「檢查後插入」)。推薦:

  • ConcurrentHashMap — 高併發 Map
  • CopyOnWriteArrayList — 讀多寫少列表
  • Collections.synchronizedList() + 手動同步塊 — 簡單場景

注意:Fail-Fast 異常 (ConcurrentModificationException) 是為了檢測併發修改,非線程安全保證。

建議 81:元素可變時勿用 TreeSet,改用 List + Collections.sort()

TreeSet 僅在插入時按 compareTo 排序,元素字段修改後不會自動調整位置,導致順序錯亂。解決方案:

  1. 改用 List,修改後調用 Collections.sort(list) 重排。
  2. 若需去重,排序前轉 HashSet 再轉回。

建議 82:集合家族全景圖

接口主要實現特點
ListArrayList, LinkedList, Vector, Stack有序、可重複、隨機訪問
SetHashSet, LinkedHashSet, TreeSet, EnumSet不重複、HashSet 查找 O(1)
MapHashMap, LinkedHashMap, TreeMap, Hashtable, Properties, EnumMap, WeakHashMap鍵值對、TreeMap 有序
QueueArrayBlockingQueue, LinkedBlockingQueue, PriorityQueue, ArrayDeque阻塞/非阻塞、雙端隊列

工具類:Arrays (數組)、Collections (集合);擴展庫:Apache Commons Collections、Guava、Eclipse Collections。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved