Set 介面不保證元素順序(HashSet 無序,LinkedHashSet 維持插入序,TreeSet 自然排序),且不支援隨機存取(無 get(index) 方法)。若需按索引取值,需轉換為支援索引的結構。
Set<Integer> set = new HashSet<>();
set.add(1); set.add(2); set.add(3); set.add(4); set.add(5);
Object[] arr = set.toArray(); // 或 toArray(new Integer[0])
System.out.println(arr[2]); // 索引 2 的元素(順序不可預期)
List<Integer> list = new ArrayList<>(set);
System.out.println(list.get(2)); // 同樣順序不可預期
// 保持插入順序
Set<Integer> ordered = new LinkedHashSet<>();
ordered.add(10); ordered.add(20); ordered.add(30);
List<Integer> list = new ArrayList<>(ordered);
System.out.println(list.get(1)); // 穩定輸出 20
Set<Integer> sorted = new TreeSet<>();
sorted.add(5); sorted.add(1); sorted.add(3);
List<Integer> list = new ArrayList<>(sorted); // [1, 3, 5]
System.out.println(list.get(0)); // 1(最小值)
| 操作 | HashSet | LinkedHashSet | TreeSet | ArrayList |
|---|---|---|---|---|
| 新增 | O(1) | O(1) | O(log n) | O(1) 摊銷 |
| 查找 | O(1) | O(1) | O(log n) | O(n) |
| 按索引取值 | 轉陣列 O(n) | 轉 List O(n) | 轉 List O(n) | O(1) |
| 記憶體 | 低 | 略高 | 高 | 低 |
ArrayList 或 LinkedList,勿強行用 Set。LinkedHashSet + new ArrayList<>(set)。TreeSet + new ArrayList<>(set)。LinkedHashMap<K, Boolean>(Key 為元素,Value 恆 true),鍵集即有序唯一集合,且可轉 List 索引。Set 本質是「成員資格測試」容器,非「序列容器」。需索引存取時,轉 List/陣列是權宜之計;根本解決在於選擇正確的資料結構。代碼審查時,若發現 set.toArray()[i],請確認是否為一次性報表匯出等非核心邏輯,核心邏輯請重構資料結構。