Java 算法题中常用数据结构

以下是 Java 算法题中常用数据结构的详细对比表格,涵盖适用场景、底层实现、时间复杂度等关键维度:

数据结构 适用场景 底层实现 插入/添加 删除 查找 空间复杂度 特点与注意
ArrayList 频繁按索引访问、元素数量动态增长但不频繁删除 动态数组(基于数组) O(1)(尾部)
O(n)(中间)
O(n)(需移动元素) O(1)(按索引)
O(n)(按值)
O(n) 支持随机访问;扩容时性能有波动
LinkedList 频繁在头部/尾部插入/删除,不依赖索引访问 双向链表 O(1)(头/尾)
O(n)(中间)
O(1)(已知节点) O(n)(需遍历) O(n) 适合队列/栈实现;内存开销大
HashMap 快速查找键值对、去重、统计频次 哈希表 + 链表/红黑树(JDK8+) O(1) 平均
O(n) 最坏
O(1) 平均
O(n) 最坏
O(1) 平均
O(n) 最坏
O(n) 哈希冲突影响性能;避免自定义类未重写 equals()/hashCode()
HashSet 去重、集合运算(并集/交集)、快速判断存在性 基于 HashMap(key 为元素) O(1) 平均 O(1) 平均 O(1) 平均 O(n) 无重复元素;不可排序
TreeMap 需要有序键值对、范围查询、前驱/后继操作 红黑树(平衡二叉搜索树) O(log n) O(log n) O(log n) O(n) 自动排序;支持 floorKey()ceilingKey() 等方法
TreeSet 排序去重、查找上下界、区间操作 基于 TreeMap O(log n) O(log n) O(log n) O(n) 有序集合;不能有重复元素
PriorityQueue 优先级调度、堆顶最大/最小、Top-K 问题 二叉堆(数组实现) O(log n) O(log n) O(1)(获取堆顶)
O(n)(删除非堆顶)
O(n) 无序存储;默认小根堆,可自定义比较器
StackDeque 实现) 括号匹配、表达式求值、递归模拟 ArrayDeque(双端队列) O(1) O(1) O(1) O(n) ArrayDeque 实现更高效;避免使用 Vector
QueueArrayDeque 层序遍历、广度优先搜索(BFS)、滑动窗口 数组环形队列 O(1) O(1) O(1) O(n) 高效且线程不安全;推荐用于算法题

✅ 使用建议(面试 & 刷题场景)

  • 频繁查找/更新HashMap / HashSet
  • 需要有序性TreeMap / TreeSet
  • 维护最大/最小值PriorityQueue
  • 按顺序访问或频繁尾插尾删ArrayList
  • 频繁头尾增删LinkedList(但多数情况下 ArrayDeque 更优)
  • 栈/队列逻辑 → 用 ArrayDeque 模拟,比 Stack/Queue 更高效

💡 提示:在 LeetCode 中,ArrayDequeStack/Queue 的首选实现。

posted @ 2025-11-01 15:57  Nickey103  阅读(7)  评论(0)    收藏  举报