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
java
// HashSet的add方法源码
public boolean add(E e) {
return map.put(e, PRESENT) == null; // 用HashMap的key去重
}
3. 如何让List去重?
-
转换为Set:
java
javaList<String> list = new ArrayList<>(); Set<String> set = new LinkedHashSet<>(list); // 保留顺序去重
四、总结图示
mermaid
java
pie
title 集合特性占比
"有序+可重复" : 3 (ArrayList/LinkedList/ArrayDeque)
"有序+不可重复" : 3 (LinkedHashSet/TreeSet/LinkedHashMap/TreeMap)
"无序+不可重复" : 2 (HashSet/HashMap)
一句话总结 :
"数组链表可重复,哈希乱序需唯一,带Link保顺序,带Tree会排序"