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会排序"