性能优化、并发安全、设计模式四大维度,而非仅停留在 API 使用层面,是从「会用」到「用好」的关键。
一、核心进阶知识点
1. 底层数据结构深度解析(性能优化基础)
集合框架的性能差异本质是数据结构不同,核心实现类底层原理必须掌握:
表格
| 集合类型 | 核心实现类 | 底层数据结构 | 核心特性(进阶) |
|---|---|---|---|
| List | ArrayList | 动态扩容数组(Object []) | 扩容因子 0.5(1.5 倍扩容)、初始容量 10;随机访问 O (1),插入删除 O (n) |
| List | LinkedList | 双向链表(Node 节点) | 无扩容成本,插入删除 O (1)(需先找到节点);实现 Deque,支持双端操作 |
| Set | HashSet | 哈希表(HashMap 封装) | 基于哈希值去重,负载因子 0.75,扩容 2 倍;哈希冲突用链表 + 红黑树(JDK8+) |
| Set | TreeSet | 红黑树(TreeMap 封装) | 自然排序 / 自定义排序,增删查 O (logn);无哈希冲突,有序但性能略低 |
| Map | HashMap | 数组 + 链表 + 红黑树 | 阈值 8(链表转红黑树)、阈值 6(红黑树转链表);JDK8 取消死循环问题 |
| Map | ConcurrentHashMap | 分段锁(JDK7)/CAS+Synchronized(JDK8+) | 并发安全,高并发下性能优于 Hashtable |
2. 并发安全集合(高并发场景必备)
普通集合(ArrayList/HashMap)非线程安全,进阶需掌握并发集合的选型与原理:
- 核心类 :
ConcurrentHashMap:高并发首选 Map,JDK8+ 用 CAS 替代分段锁,仅锁定当前桶,并发效率高;CopyOnWriteArrayList:读多写少场景(如配置读取),写操作复制数组,读无锁,避免ConcurrentModificationException;BlockingQueue(阻塞队列):ArrayBlockingQueue(数组)、LinkedBlockingQueue(链表),用于生产者 - 消费者模型;
- 避坑点 :
Collections.synchronizedList()是全局锁,高并发下性能远低于CopyOnWriteArrayList。
3. 集合设计模式与核心接口
- 迭代器模式 :
Iterator接口统一遍历方式,forEachRemaining()批量遍历优化性能; - 适配器模式 :
Arrays.asList()将数组转为 List(注意:返回的是固定长度 List,不可 add/remove); - 空集合优化 :用
Collections.emptyList()/emptyMap()替代new ArrayList<>(),减少内存占用; - 不可变集合 (JDK9+):
List.of()/Map.of()创建不可变集合,线程安全且性能更高(无扩容开销)。
4. 性能优化实战技巧
- 容量初始化 :创建集合时指定初始容量(如
new ArrayList<>(100)),避免频繁扩容; - 遍历方式选择 :
- ArrayList:普通 for 循环 > 迭代器 > for-each;
- LinkedList:迭代器 /for-each > 普通 for 循环(避免下标遍历的 O (n²) 耗时);
- 避免自动装箱 :使用
IntArrayList(Apache Commons)替代ArrayList<Integer>,减少拆装箱开销; - 批量操作 :
addAll()批量添加元素,比循环 add () 减少扩容次数。
5. 常见面试 / 实战坑点
HashMap键值为 null:键仅允许 1 个 null,值允许多个 null;Hashtable不允许 null;ConcurrentModificationException:遍历集合时修改元素(如 add/remove)会触发,解决方案:用迭代器的remove()或并发集合;TreeSet/TreeMap排序:自定义类作为键需实现Comparable或传入Comparator,否则抛ClassCastException。
二、进阶实战代码示例
1. 不可变集合创建(JDK9+)
java
运行
import java.util.List;
import java.util.Map;
public class ImmutableCollectionDemo {
public static void main(String[] args) {
// 不可变List,不支持add/remove
List<String> immutableList = List.of("Java", "Python", "C++");
// 不可变Map,最多支持10个键值对,超过用Map.ofEntries()
Map<Integer, String> immutableMap = Map.of(1, "Java", 2, "Python");
System.out.println(immutableList); // [Java, Python, C++]
System.out.println(immutableMap); // {1=Java, 2=Python}
}
}
2. 高并发场景集合选型
java
运行
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ConcurrentHashMap;
public class ConcurrentCollectionDemo {
public static void main(String[] args) {
// 读多写少场景:配置列表
CopyOnWriteArrayList<String> configList = new CopyOnWriteArrayList<>();
configList.add("timeout=1000");
configList.add("max_conn=100");
// 高并发Map:用户信息存储
ConcurrentHashMap<String, String> userMap = new ConcurrentHashMap<>();
userMap.put("user1", "123456");
userMap.put("user2", "654321");
// 并发遍历无异常
userMap.forEach((k, v) -> System.out.println(k + ":" + v));
}
}
3. ArrayList 容量优化
java
运行
import java.util.ArrayList;
public class ArrayListOptimize {
public static void main(String[] args) {
// 已知元素数量为1000,指定初始容量,避免扩容
ArrayList<String> list = new ArrayList<>(1000);
// 批量添加,减少扩容次数
for (int i = 0; i < 1000; i++) {
list.add("element-" + i);
}
System.out.println("集合大小:" + list.size()); // 1000
System.out.println("当前容量(反射获取):" + getCapacity(list));
}
// 反射获取ArrayList实际容量(进阶调试用)
private static int getCapacity(ArrayList<?> list) {
try {
java.lang.reflect.Field field = ArrayList.class.getDeclaredField("elementData");
field.setAccessible(true);
Object[] array = (Object[]) field.get(list);
return array.length;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
}
总结
- Java 集合框架进阶核心是理解底层数据结构,这是性能优化和选型的基础;
- 高并发场景需区分「读多写少」(CopyOnWrite 系列)和「高并发读写」(ConcurrentHashMap)的集合选型;
- 实战优化关键是「指定初始容量」「避免自动装箱」「批量操作」,减少扩容和不必要的性能损耗。