Java 集合有序性與重復性總結及記憶技巧
一、集合分類速查表
集合類型 | 是否有序 | 是否允許重復 | 記憶口訣 |
---|---|---|---|
ArrayList | ? 有序(插入順序) | ? 可重復 | "數組列表,順序記牢" |
LinkedList | ? 有序(插入順序) | ? 可重復 | "鏈表結構,先來后到" |
HashSet | ? 無序(插入時沒有順序) | ? 不可重復 | "哈希散列,亂序唯一" |
LinkedHashSet | ? 有序(插入順序) | ? 不可重復 | "鏈表哈希,有序唯一" |
TreeSet | ? 有序(自然/定制排序) | ? 不可重復 | "樹形排序,規則唯一" |
HashMap | ? 無序 | Key不可重復 | "哈希大哥,亂序當家" |
LinkedHashMap | ? 有序(插入/訪問順序) | Key不可重復 | "鏈表哈希,順序鑰匙" |
TreeMap | ? 有序(Key排序) | Key不可重復 | "樹形鑰匙,排隊進門" |
ArrayDeque | ? 有序(隊列/棧順序) | ? 可重復 | "雙端隊列,先進先出" |
二、記憶方法大全
1. 按數據結構記憶
-
數組/鏈表結構(ArrayList/LinkedList/ArrayDeque):
→?有序 + 可重復(像排隊,先來后到,可以有人同名) -
哈希表結構(HashSet/HashMap):
→?無序 + 不可重復(像丟進桶里的球,亂序且唯一) -
鏈表+哈希組合(LinkedHashSet/LinkedHashMap):
→?有序 + 不可重復(用鏈表記錄順序,但內容唯一) -
樹形結構(TreeSet/TreeMap):
→?排序 + 不可重復(像字典,按字母排序且單詞唯一)
2. 命名規律記憶
-
帶"Linked":有序(插入順序)
LinkedHashSet
、LinkedHashMap
-
帶"Tree":排序(自然/定制順序)
TreeSet
、TreeMap
-
純"Hash":無序
HashSet
、HashMap
-
帶"List":有序+可重復
ArrayList
、LinkedList
3. 生活場景聯想
-
ArrayList?→?班級點名冊
(按學號順序記錄,允許同名同姓) -
HashSet?→?抽獎箱
(名字丟進去亂序混合,但每人只能中獎一次) -
TreeSet?→?字典目錄
(按字母排序,每個單詞唯一) -
LinkedHashMap?→?餐廳排隊系統
(按排隊順序叫號,但每個號碼唯一)
三、面試高頻問題
1. 如何選擇集合?
-
需要快速訪問且不關心順序? →?
HashMap
/HashSet
-
需要保持插入順序? →?
LinkedHashMap
/LinkedHashSet
-
需要自動排序? →?
TreeMap
/TreeSet
-
需要允許重復? →?
ArrayList
/LinkedList
2. 為什么Set不允許重復?
-
底層用Map實現(如HashSet用HashMap),重復元素會被覆蓋:
java
// HashSet的add方法源碼
public boolean add(E e) {return map.put(e, PRESENT) == null; // 用HashMap的key去重
}
3. 如何讓List去重?
-
轉換為Set:
java
List<String> list = new ArrayList<>(); Set<String> set = new LinkedHashSet<>(list); // 保留順序去重
四、總結圖示
mermaid
pietitle 集合特性占比"有序+可重復" : 3 (ArrayList/LinkedList/ArrayDeque)"有序+不可重復" : 3 (LinkedHashSet/TreeSet/LinkedHashMap/TreeMap)"無序+不可重復" : 2 (HashSet/HashMap)
一句話總結:
"數組鏈表可重復,哈希亂序需唯一,帶Link保順序,帶Tree會排序"