啥也没干,电脑也没打开,看了一天浪姐,明天早上努力努力。准备秋招第20天。
这里系统梳理 Java 集合 核心知识点,分架构、常用类、方法、区别、面试考点,由浅入深,方便学习和背诵。
一、集合整体架构
Java 集合分为两大顶层接口:Collection(单列集合)、Map(双列集合,键值对)
集合框架全部位于 java.util 包下,线程不安全(除 Vector、HashTable)。
plaintext
java.util
├─ Collection 单列集合(存单个对象)
│ ├─ List 有序、可重复、有索引
│ │ ├─ ArrayList
│ │ ├─ LinkedList
│ │ └─ Vector(老旧,线程安全)
│ ├─ Set 无序、不可重复、无索引
│ │ ├─ HashSet
│ │ ├─ LinkedHashSet
│ │ └─ TreeSet
│ └─ Queue/Deque 队列/双端队列
│ ├─ LinkedList
│ └─ ArrayDeque
│
└─ Map 双列集合(key-value 键值对)
├─ HashMap
├─ LinkedHashMap
├─ TreeMap
└─ HashTable(老旧,线程安全)
二、Collection 通用方法(所有单列集合都能用)
不管 List/Set/Queue,都继承这些核心方法:
java
boolean add(E e); // 添加单个元素
boolean remove(Object o); // 删除指定元素
boolean contains(Object o);// 判断是否包含元素
int size(); // 获取集合长度
boolean isEmpty(); // 判断是否为空
void clear(); // 清空集合
Object\[\] toArray(); // 转数组
Iterator<E> iterator(); // 获取迭代器(遍历)
单列集合三种遍历方式
-
普通 for 循环(仅 List 有索引可用)
-
增强 for 循环(foreach,所有 Collection 通用)
-
迭代器 Iterator(集合标准遍历,可遍历中删除元素)
示例:
java
ArrayList<String> list = new ArrayList<>();
list.add("A");
list.add("B");
// 1. 增强for
for (String s : list) {
System.out.println(s);
}
// 2. 迭代器
Iterator<String> it = list.iterator();
while(it.hasNext()){
String s = it.next();
// it.remove(); // 安全删除元素
}
三、List 接口(有序、可重复、带索引)
- ArrayList
-
底层:动态扩容数组
-
特点:查询、修改速度极快;中间位置增删慢(需要移动元素)
-
初始容量:10;扩容规则:原容量 1.5倍
-
线程不安全,适合查询多、增删少场景
常用独有方法(索引操作):
java
get(int index); // 根据索引获取元素
set(int index,E e);// 根据索引修改
add(int index,E e);// 指定位置插入
remove(int index); // 根据索引删除
- LinkedList
-
底层:双向链表
-
特点:首尾增删速度极快;随机查询慢
-
同时实现 List + Deque ,可当列表、队列、栈使用
首尾操作方法:
java
addFirst(E e);
addLast(E e);
getFirst();
getLast();
removeFirst();
removeLast();
- Vector
-
底层:数组,和 ArrayList 类似
-
区别:线程安全(所有方法加锁),效率极低,项目基本废弃不用
List 三者对比速记
-
日常开发首选:ArrayList
-
频繁首尾增删、做队列/栈:LinkedList
-
放弃使用:Vector
四、Set 接口(无序、元素唯一、无索引)
去重原理:依赖 hashCode() + equals() 两个方法判断元素是否重复。
自定义对象存 Set,必须重写 hashCode 和 equals,否则去重失效。
- HashSet
-
底层:HashMap(哈希表:数组+链表+红黑树 JDK1.8)
-
特点:无序、去重、查询效率高
-
元素存取顺序和添加顺序不一致
- LinkedHashSet
-
底层:LinkedHashMap(哈希表 + 双向链表)
-
特点:有序(保留插入顺序)、去重;性能略低于 HashSet
- TreeSet
-
底层:TreeMap(红黑树)
-
特点:自动自然排序、去重、无序(不保留插入顺序)
-
要求元素:
-
基本类型包装类:默认按大小排序
-
自定义对象:必须实现 Comparable 接口,或传入比较器 Comparator
Set 选型
-
只去重、不关心顺序:HashSet
-
去重 + 保留插入顺序:LinkedHashSet
-
去重 + 自动排序:TreeSet
五、Queue & Deque 队列、双端队列
- Queue 队列(先进先出 FIFO)
常用方法(分两组,一组抛异常、一组返回 null)
功能 抛异常 返回特殊值
入队 add() offer()
出队 remove() poll()
查看队首 element() peek()
开发推荐使用: offer / poll / peek ,避免空集合抛出异常。
- Deque 双端队列
Queue 的子接口,两端都可以增删,兼顾队列、栈功能。
实现类
- ArrayDeque
-
底层:循环数组,性能最强
-
不能存储 null ,栈、队列首选,替代老旧 Stack 类
- LinkedList
- 底层:双向链表,功能全,允许存 null
栈用法(后进先出 LIFO)
java
Deque<Integer> stack = new ArrayDeque<>();
stack.push(1); // 压栈
stack.pop(); // 弹栈
stack.peek(); // 取栈顶
六、Map 接口(键值对 key-value,key 唯一)
特点:key 不允许重复,value 可重复;无索引。
- HashMap(使用最多)
-
底层:哈希表(数组+链表+红黑树)
-
JDK1.8 优化:链表长度 ≥8 且数组容量≥64,转为红黑树;链表长度≤6 退化为链表
-
初始容量 16,扩容:2倍
-
无序、线程不安全,查询/增删效率极高
- LinkedHashMap
-
底层:哈希表 + 双向链表
-
保留插入顺序;可实现 LRU 最近最少使用缓存
- TreeMap
-
底层:红黑树
-
按键自动排序
- HashTable
-
老旧类,线程安全,效率低;不推荐使用
-
区别:HashMap 允许 null 键值,HashTable 不允许
Map 通用方法
java
put(K key,V value); // 添加/修改键值对
get(Object key); // 根据key获取value
remove(Object key); // 根据key删除
containsKey(Object key); // 判断是否包含指定key
containsValue(Object v); // 判断是否包含指定value
keySet(); // 获取所有key集合
entrySet(); // 获取所有键值对(高效遍历)
Map 两种遍历方式
java
HashMap<String,Integer> map = new HashMap<>();
// 1. 遍历 key,再取 value
for (String key : map.keySet()) {
System.out.println(key + "=" + map.get(key));
}
// 2. 遍历键值对(推荐,效率更高)
for (Map.Entry<String,Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}
Map 选型
-
普通键值对,不关心顺序:HashMap
-
要保留插入顺序:LinkedHashMap
-
要求 key 自动排序:TreeMap
七、高频核心区别(面试必背)
-
ArrayList vs LinkedList
-
底层:数组 / 双向链表
-
查询改:ArrayList 快;增删(首尾除外):LinkedList 快
-
内存:ArrayList 连续空间;LinkedList 节点分散,额外存引用
-
HashMap vs HashTable
-
线程安全:HashMap 不安全;HashTable 安全
-
null 值:HashMap 允许一个 null key、多个 null value;HashTable 不允许
-
迭代器:HashMap 快速失败;HashTable 枚举器
-
ArrayDeque vs LinkedList(做栈/队列)
-
底层:循环数组 / 双向链表
-
性能:ArrayDeque 更快,数组寻址优于链表
-
限制:ArrayDeque 不能存 null;LinkedList 可以
-
HashSet 去重原理
添加元素时:
-
先调用 hashCode() 计算哈希值,确定存放位置
-
位置已有元素,再调用 equals() 比较内容
-
两个方法都返回 true → 判定重复,不存入
八、补充工具类 & 并发集合
- Collections:集合工具类(静态方法)
java
Collections.sort(list); // 排序
Collections.shuffle(list); // 打乱顺序
Collections.synchronizedList(list); // 转成线程安全集合
- 并发场景(多线程)
单线程用上面普通集合;多线程推荐:
-
CopyOnWriteArrayList 替代 ArrayList
-
ConcurrentHashMap 替代 HashMap(主流)
九、学习路线总结(刷题/面试顺序)
-
先掌握 List:ArrayList、LinkedList(索引、增删改查、遍历)
-
再学 Queue/Deque:ArrayDeque、LinkedList 实现栈和队列
3