Java集合框架中常用类及其底层数据结构的详细分类

1. 数组(Array)

特点:内存连续,支持随机访问,增删效率低(需扩容或移动元素)。

  • ArrayList
    基于动态数组,扩容时创建新数组并拷贝数据(默认扩容 1.5 倍)。
  • Vector
    线程安全的动态数组,扩容策略与 ArrayList 类似(默认扩容 2 倍)。
  • ArrayDeque
    基于循环数组实现的双端队列,支持高效的头尾插入和删除。
  • HashMap 的桶数组
    存储链表头或红黑树根节点,通过哈希函数定位桶位置。
  • PriorityQueue
    基于数组实现二叉堆(逻辑上是完全二叉树,物理存储是数组)。

2. 链表(Linked List)

特点:内存不连续,增删效率高,随机访问效率低。

  • LinkedList
    双向链表实现,每个节点存储前后节点引用。
  • LinkedHashMap
    继承 HashMap,通过双向链表维护键的插入顺序或访问顺序。
  • LinkedHashSet
    基于 LinkedHashMap 实现,通过链表维护元素插入顺序。
  • HashMap 的冲突链表(JDK 8 前)
    哈希冲突时,桶内元素以链表形式存储(JDK 8 后链表可能转为红黑树)。

3. 树(Tree)

特点:有序存储,支持高效查找、插入和删除(时间复杂度 O(log n))。

  • TreeMap
    基于红黑树(自平衡二叉搜索树),键按自然顺序或 Comparator 排序。
  • TreeSet
    基于 TreeMap 实现,元素按自然顺序或 Comparator 排序。
  • HashMap 的红黑树(JDK 8+)
    当单个桶的链表长度超过 8 且哈希表容量 ≥64 时,链表转为红黑树。

4. 栈(Stack)

特点:后进先出(LIFO),通过限制操作实现栈语义。

  • Stack
    继承自 Vector,基于数组实现(已过时,不推荐使用)。
  • Deque 接口的实现类
    ArrayDequeLinkedList,通过 push()pop() 模拟栈操作。

5. 堆(Heap)

特点:优先队列,按优先级出队(通常是小顶堆或大顶堆)。

  • PriorityQueue
    基于数组实现二叉堆,通过 Comparator 或自然顺序维护优先级。

6. 队列(Queue)

特点:先进先出(FIFO)或按优先级出队。

  • LinkedList
    双向链表实现普通队列。
  • ArrayDeque
    循环数组实现双端队列。
  • PriorityQueue
    二叉堆实现优先队列。
  • BlockingQueue 实现类(如 ArrayBlockingQueue、LinkedBlockingQueue)
    基于数组或链表的线程安全队列。

7. 图(Graph)

特点:表示节点与边的关系,Java 标准库未直接提供图实现。

  • 第三方库(如 JGraphT)
    提供邻接表、邻接矩阵等图的实现。
  • 自定义实现
    可通过 Map<Node, List<Edge>>(邻接表)或二维数组(邻接矩阵)表示图。

数据结构与集合类对照表

数据结构 集合类 应用场景
数组 ArrayList, Vector, ArrayDeque, HashMap 的桶数组, PriorityQueue 频繁随机访问、队列操作、哈希存储
链表 LinkedList, LinkedHashMap, LinkedHashSet, HashMap 的冲突链表(JDK8前) 频繁增删、维护插入顺序
TreeMap, TreeSet, HashMap 的红黑树(JDK8+) 有序存储、范围查询、高频哈希冲突优化
Stack(过时), Deque 的实现类(如 ArrayDeque) 函数调用栈、括号匹配、表达式求值
PriorityQueue 任务调度、求 Top K 问题、哈夫曼编码
队列 LinkedList, ArrayDeque, PriorityQueue, BlockingQueue 实现类 消息队列、线程池任务队列、广度优先搜索
需第三方库或自定义实现(如 JGraphT) 社交网络、路径规划、依赖关系分析

示例代码说明

java 复制代码
// 数组结构示例(ArrayList)
List<Integer> list = new ArrayList<>();
list.add(1); // 触发扩容时拷贝数组

// 链表结构示例(LinkedList)
Deque<Integer> deque = new LinkedList<>();
deque.addFirst(10); // 修改链表头节点

// 树结构示例(TreeMap)
TreeMap<String, Integer> treeMap = new TreeMap<>();
treeMap.put("b", 2); // 红黑树插入平衡操作

// 堆结构示例(PriorityQueue)
PriorityQueue<Integer> heap = new PriorityQueue<>();
heap.offer(5); // 上浮调整堆结构

// 队列示例(ArrayBlockingQueue)
BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10);
queue.put(1); // 数组循环写入

总结

  • 数组:适合高频随机访问,但增删成本高。
  • 链表:适合高频增删,但访问效率低。
  • :适合有序数据存储和范围查询。
  • :适合优先级调度场景。
  • 队列/栈:适合特定算法需求(如 BFS/DFS)。
  • :需借助第三方库实现复杂关系建模。
相关推荐
一 乐4 分钟前
校园墙|校园社区|基于Java+vue的校园墙小程序系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端·小程序
TT哇4 分钟前
【面经 每日一题】面试题16.25.LRU缓存(medium)
java·算法·缓存·面试
青云交5 分钟前
Java 大视界 -- 基于 Java 的大数据联邦学习在跨行业数据协同创新中的实践突破
java·分布式计算·隐私保护·apache flink·大数据联邦学习·跨行业数据协同·安全通信
合作小小程序员小小店6 分钟前
桌面开发,在线%考试管理%系统,基于eclipse,java,swing,mysql数据库。
java·数据库·mysql·eclipse·jdk
T.Ree.8 分钟前
汇编_读写内存
开发语言·汇编·c#
oioihoii10 分钟前
C/C++混合项目中的头文件管理:.h与.hpp的分工与协作
java·c语言·c++
im_AMBER17 分钟前
数据结构 11 图
数据结构·笔记·学习·图论
一瓢一瓢的饮 alanchan21 分钟前
Flink原理与实战(java版)#第2章 Flink的入门(第二节Flink简介)
java·大数据·flink·kafka·实时计算·离线计算·流批一体化计算
vx_bscxy32223 分钟前
告别毕设焦虑!Python 爬虫 + Java 系统 + 数据大屏,含详细开发文档 基于微信小程序的民宿预约系统22398 (上万套实战教程,赠送源码)
java·spring boot·mysql·微信小程序·课程设计
kaikaile199527 分钟前
基于MATLAB的直接序列扩频(DSSS)通信系统仿真实现
开发语言·matlab