集合體系繼承關係
Iterable
└── Collection
├── List (有序、可重複)
│ ├── ArrayList
│ ├── LinkedList
│ ├── Vector (同步)
│ └── Stack
├── Set (無序、唯一)
│ ├── HashSet
│ ├── LinkedHashSet
│ └── SortedSet → TreeSet
└── Queue (FIFO)
├── PriorityQueue
├── ArrayDeque
└── LinkedList
Map (鍵值對、Key唯一)
├── HashMap
├── Hashtable (同步)
├── LinkedHashMap
└── SortedMap → TreeMap
核心接口詳解
Iterable & Iterator
// Iterable
Iterator<T> iterator();
// Iterator
boolean hasNext();
E next();
void remove();
Collection 基礎操作
add/remove/contains/size/isEmpty/clear
- 批量操作:
addAll/removeAll/retainAll/containsAll
- 轉數組:
toArray()
- 相等比較:
equals/hashCode
List 接口特有功能
- 索引操作:
get/set/add/remove/indexOf/lastIndexOf
- 範圍視圖:
subList(from, to)
- 雙向迭代器:
ListIterator(支持 previous/add/set)
Set 接口特點
- 不允許重複元素(
equals 判定)
- 最多一個
null
Queue/Deque 接口
Queue:offer/poll/peek
Deque:雙端操作 addFirst/addLast/removeFirst/removeLast
Map 接口
- 鍵值對集合,Key 唯一
- 核心方法:
put/get/remove/containsKey/containsValue/keySet/values/entrySet
SortedMap 保證 Key 有序
主要實現類對比
| 類 | 底層結構 | 線程安全 | 有序性 | Null值 | 特點 |
| ArrayList | 動態數組 | 否 | 插入序 | 允許 | 隨機訪問快 |
| LinkedList | 雙向鏈表 | 否 | 插入序 | 允許 | 增刪快,實現 Deque |
| Vector | 動態數組 | 是 | 插入序 | 允許 | 舊類,擴容 2倍 |
| Stack | 繼承 Vector | 是 | 插入序 | 允許 | LIFO,push/pop/peek |
| HashSet | HashMap | 否 | 無序 | 一個 | O(1) 增刪查 |
| LinkedHashSet | LinkedHashMap | 否 | 插入序 | 一個 | 維護雙向鏈表 |
| TreeSet | 紅黑樹 | 否 | 自然序/比較器 | 不允許 | O(log n),NavigableSet |
| HashMap | 數組+鏈表/紅黑樹 | 否 | 無序 | 允許 | JDK8 樹化優化 |
| TreeMap | 紅黑樹 | 否 | Key有序 | Key不允許 | NavigableMap |
線程安全包裝器
List<T> syncList = Collections.synchronizedList(new ArrayList<>());
Set<T> syncSet = Collections.synchronizedSet(new HashSet<>());
Map<K,V> syncMap = Collections.synchronizedMap(new HashMap<>());
// 迭代時需手動同步鎖定集合對象
常用工具方法
Arrays.asList(T...):定長 List,修改元素影響原數組
Collections.sort/binarySearch:排序與二分查找
Comparable/Comparator:自然序與定製序
代碼示例精選
ListIterator 雙向遍歷與修改
ListIterator<Integer> it = list.listIterator();
while (it.hasNext()) System.out.print(it.next() + " ");
it.set(-1); // 修改最後訪問元素
while (it.hasPrevious()) System.out.print(it.previous() + " ");
TreeSet 自定義比較器
TreeSet<Person> ts = new TreeSet<>(Comparator.comparingInt(Person::getAge));
ts.add(new Person(1, 25));
ts.add(new Person(2, 20)); // 按年齡升序
Vector 與 Enumeration
Enumeration<Integer> e = vector.elements();
while (e.hasMoreElements()) System.out.print(e.nextElement() + " ");
選型建議
- 高頻隨機讀 →
ArrayList
- 高頻頭尾增刪 →
LinkedList/ArrayDeque
- 去重 + 無序 →
HashSet
- 去重 + 有序 →
TreeSet/LinkedHashSet
- 鍵值映射 →
HashMap(非線程安全)/ ConcurrentHashMap(並發)
- 需要同步 → 並發包下對應類優於
Vector/Hashtable