全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-10 10 分钟 ✍️ juanwangdev

集合性能分析

集合性能取决于底层数据结构和操作类型,选择合适的集合对性能至关重要。

List 性能对比

时间复杂度

操作ArrayListLinkedList
get(index)O(1)O(n)
add(末尾)O(1)O(1)
add(头部)O(n)O(1)
add(中间)O(n)O(n)
remove(末尾)O(1)O(1)
remove(头部)O(n)O(1)
remove(中间)O(n)O(n)
containsO(n)O(n)

ArrayList 性能分析

Java
// 查询快:索引直接定位
list.get(1000);  // O(1),无需遍历

// 中间插入慢:需移动后续元素
list.add(500, "new");  // O(n),移动 500 个元素

// 扩容开销
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 100000; i++) {
    list.add(i);  // 默认容量 10,多次扩容
}

// 优化:预设容量
List<Integer> list = new ArrayList<>(100000);
for (int i = 0; i < 100000; i++) {
    list.add(i);  // 无扩容,性能提升
}

LinkedList 性能分析

Java
// 头部操作快
list.addFirst("head");  // O(1)
list.removeFirst();     // O(1)

// 中间操作慢:需遍历定位
list.add(500, "new");   // O(n),先遍历到位置 500

// 随机访问慢
list.get(50000);        // O(n),遍历 50000 次

Set 性能对比

时间复杂度

操作HashSetLinkedHashSetTreeSet
addO(1)O(1)O(log n)
removeO(1)O(1)O(log n)
containsO(1)O(1)O(log n)

HashSet 性能分析

Java
Set<Integer> set = new HashSet<>();
set.add(100);         // O(1),哈希定位
set.contains(100);    // O(1),哈希定位
set.remove(100);      // O(1),哈希定位

// 哈希冲突影响性能
Set<String> set = new HashSet<>();
for (int i = 0; i < 100000; i++) {
    set.add("key" + i);  // 理想 O(1),冲突时略有下降
}

HashSet 性能影响因素:hashCode 质量、哈希冲突程度、容量和负载因子。

TreeSet 性能分析

Java
TreeSet<Integer> set = new TreeSet<>();
set.add(100);         // O(log n),红黑树插入
set.contains(100);    // O(log n),红黑树查找

// 排序功能有代价
// 10 万元素:HashSet 约 10ms,TreeSet 约 50ms

Map 性能对比

时间复杂度

操作HashMapLinkedHashMapTreeMap
getO(1)O(1)O(log n)
putO(1)O(1)O(log n)
removeO(1)O(1)O(log n)

HashMap 性能优化

Java
// 默认:容量 16,负载因子 0.75
Map<String, Integer> map = new HashMap<>();

// 预设容量避免扩容(推荐)
int expectedSize = 10000;
Map<String, Integer> map = new HashMap<>(expectedSize);

// 实际容量公式:(expectedSize / 0.75) + 1
Map<String, Integer> map = new HashMap<>((int)(10000 / 0.75) + 1);

// 大量数据测试
// 10 万次 put:预设容量约 20ms,默认容量约 50ms(多次扩容)

扩容开销:每次扩容需重新计算所有元素位置,性能下降明显。

HashMap JDK 8 优化

  • 链表长度 > 8 且容量 > 64 → 转红黑树
  • 红黑树查找 O(log n),链表查找 O(n)
  • 哈希冲突严重时性能提升

集合选择原则

List 选择

场景推荐原因
频繁随机访问ArrayListO(1) 查询
频繁头部插入删除LinkedListO(1) 头部操作
预知元素数量ArrayList(预设容量)避免扩容
线程安全需求CopyOnWriteArrayList读多写少

Set 选择

场景推荐原因
一般去重HashSetO(1) 性能最高
去重+保持顺序LinkedHashSet插入顺序
去重+排序TreeSet自然排序
高并发去重ConcurrentHashMap.keySet()并发安全

Map 选择

场景推荐原因
一般键值存储HashMapO(1) 性能最高
有序键值存储LinkedHashMap插入/访问顺序
排序键值存储TreeMap自然排序
高并发键值存储ConcurrentHashMap并发安全

性能优化建议

  1. 预设容量:ArrayList/HashMap 预知元素数量时设置初始容量
  2. 选择合适实现:根据操作特点选择 ArrayList/LinkedList、HashSet/TreeSet
  3. 避免频繁扩容:HashMap 扩容开销大,预设容量
  4. 使用并发集合:多线程环境用 ConcurrentHashMap 替代 synchronizedMap
  5. hashCode 质量:自定义对象实现好的 hashCode 减少冲突

要点总结

  • ArrayList 查询 O(1),插入删除 O(n)
  • LinkedList 头部操作 O(1),查询 O(n)
  • HashSet/HashMap O(1),TreeSet/TreeMap O(log n)
  • ArrayList/HashMap 预设容量避免扩容
  • 频繁随机访问用 ArrayList,频繁头部操作用 LinkedList
  • 一般场景用 HashSet/HashMap,排序用 TreeSet/TreeMap
  • 高并发用 ConcurrentHashMap

📝 发现内容有误?点击此处直接编辑

← 上一篇 集合工具类 Collections
下一篇 → 泛型与反射
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库