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

Java 中 Set 與 List 的關係與差異介紹

     編輯:Java 相關知識

集合框架核心:List vs Set 詳細對比

List 和 Set 都是 Collection 接口的子接口,但語義、特性、實現類及適用場景截然不同。

核心區別速覽

特性ListSet
有序性有序(按插入順序維護)無序(HashSet)或排序(TreeSet)
重複元素允許重複不允許重複(依賴 equals())
索引訪問支持 get(index) 隨機訪問不支持索引訪問
Null 元素允許多個 null最多允許一個 null (HashSet/LinkedHashSet)
主要實現類ArrayList, LinkedList, VectorHashSet, LinkedHashSet, TreeSet

List 實現類特點

  • ArrayList:動態數組,隨機訪問快 O(1),插刪慢 O(n)(需移動元素),非線程安全。
  • LinkedList:雙向鏈表,插刪快 O(1)(僅修改指針),隨機訪問慢 O(n),實現 Deque 接口可作棧/隊列,非線程安全。
  • Vector:同步化 ArrayList,性能差,已被 Collections.synchronizedList 或 CopyOnWriteArrayList 替代。

Set 實現類特點

  • HashSet:基於 HashMap 實現,查找/增刪 O(1),無序,元素需正確重寫 hashCode() 和 equals()。
  • LinkedHashSet:HashSet + 雙向鏈表,保持插入順序迭代,性能略低於 HashSet。
  • TreeSet:基於紅黑樹,元素有序(自然順序或 Comparator),查找/增刪 O(log n),需實現 Comparable 或提供 Comparator。

存儲結構對比

  • ArrayList:連續內存數組
  • LinkedList:離散節點鏈表
  • HashSet:哈希表(數組+鏈表/紅黑樹)
  • TreeSet:紅黑樹

編程最佳實踐

  1. 面向接口編程:List list = new ArrayList<>(); 便於後期替換實現。
  2. 重寫 equals 必重寫 hashCode:放入 HashSet/HashMap 的對象必須滿足「equal objects must have equal hash codes」契約。
  3. 選型指南:
    • 需頻繁隨機訪問、少量增刪 → ArrayList
    • 需頻繁頭尾增刪、作棧/隊列 → LinkedList
    • 需去重、快速查找、不關心順序 → HashSet
    • 需去重、保持插入順序 → LinkedHashSet
    • 需去重、自動排序 → TreeSet
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved