目录
[✅ 一、线性数据结构](#✅ 一、线性数据结构)
[1. 数组(Array)](#1. 数组(Array))
[2. ArrayList(动态数组)](#2. ArrayList(动态数组))
[3. LinkedList(双向链表)](#3. LinkedList(双向链表))
[✅ 二、集合类结构(Collection Framework)](#✅ 二、集合类结构(Collection Framework))
[1. List(有序可重复)](#1. List(有序可重复))
[2. Set(无序不可重复)](#2. Set(无序不可重复))
[3. Map(键值对,键唯一)](#3. Map(键值对,键唯一))
[4. 树(Tree)](#4. 树(Tree))
[5. 图(Graph)](#5. 图(Graph))
[6. 堆(Heap)](#6. 堆(Heap))
[✅ 三、队列和栈结构(Queue / Stack)](#✅ 三、队列和栈结构(Queue / Stack))
[1. Queue(队列)](#1. Queue(队列))
[2. Stack(栈)](#2. Stack(栈))
[✅ 四、并发数据结构(java.util.concurrent)](#✅ 四、并发数据结构(java.util.concurrent))
[✅ 五、特殊结构与工具类](#✅ 五、特殊结构与工具类)
[✅六、Streams(Java 8)](#✅六、Streams(Java 8))
具体如下:
Java 中的数据结构主要包含在以下几个核心包中:
- 
java.util
- 
java.util.concurrent
- 
java.util.stream
- 
以及 Java 原生数组类型 
线性结构 、非线性结构 、集合框架结构 、并发结构 等Java 中常用的数据结构:
✅ 一、线性数据结构
1. 数组(Array)
- 
定长,支持随机访问,性能高 
- 
适合元素个数已知且不频繁变动的场景 
            
            
              java
              
              
            
          
          int[] arr = new int[10];
- 描述:数组是固定大小的线性数据结构,用于存储相同类型的元素,元素在内存中是连续存储的。
- 优点 :
- 访问速度快,支持O(1)的随机访问。
- 内存使用效率高,存储密度大。
- 缺点 :
- 大小固定,无法动态扩展。
- 插入和删除操作复杂,需要移动大量元素。
- 适用场景:适用于需要频繁访问元素且元素数量已知的场景,如存储固定大小的数据集。
2. ArrayList(动态数组)
- 
实现了 List 接口,底层使用动态数组 
- 
查询快,插入删除慢(涉及数组复制) 
3. LinkedList(双向链表)
- 
实现了 List 和 Deque 接口 
- 
插入删除快,查询慢 
- 描述:链表由节点组成,每个节点包含数据和指向下一个节点的引用。链表可以是单向或双向的。
- 优点 :
- 动态大小,易于插入和删除操作(O(1))。
- 不需要连续的内存空间。
- 缺点 :
- 访问速度较慢,查找元素的时间复杂度为O(n)。
- 额外的内存开销用于存储指针。
- 适用场景:适用于需要频繁插入和删除操作的场景,如实现队列或栈。
✅ 二、集合类结构(Collection Framework)
Java 的集合框架主要分为三大体系结构:List、Set、Map。
Java的集合框架提供了多种数据结构的实现,主要包括:
- List (如ArrayList、LinkedList)
- 描述:有序的元素集合,允许重复元素。
- 优点:支持随机访问(ArrayList),插入和删除操作灵活(LinkedList)。
- 缺点:ArrayList在插入和删除时性能较低,LinkedList在随机访问时性能较低。
- Set (如HashSet、TreeSet)
- 描述:不允许重复元素的集合。
- 优点:HashSet提供快速查找,TreeSet提供有序性。
- 缺点:HashSet不保证元素的顺序,TreeSet的性能较低(O(log n))。
- Map (如HashMap、TreeMap)
- 描述:键值对集合,允许根据键快速查找值。
- 优点:HashMap提供O(1)的查找速度,TreeMap提供有序性。
- 缺点:HashMap在多线程环境下不安全,TreeMap的性能较低(O(log n))。
1. List(有序可重复)
| 类型 | 底层结构 | 特点 | 
|---|---|---|
| ArrayList | 动态数组 | 查询快,增删慢 | 
| LinkedList | 双向链表 | 查询慢,增删快 | 
| Vector | 线程安全的动态数组 | 几乎被淘汰,效率低 | 
2. Set(无序不可重复)
| 类型 | 底层结构 | 特点 | 
|---|---|---|
| HashSet | Hash 表(HashMap 实现) | 插入快,元素无序 | 
| LinkedHashSet | Hash 表 + 双向链表 | 有插入顺序 | 
| TreeSet | 红黑树 | 元素有序,支持范围查找 | 
| EnumSet | 位向量 | 用于枚举类型集合,性能极佳 | 
3. Map(键值对,键唯一)
| 类型 | 底层结构 | 特点 | 
|---|---|---|
| HashMap | 哈希表 | 无序,允许空键值 | 
| LinkedHashMap | HashMap + 链表 | 有插入顺序 | 
| TreeMap | 红黑树 | 键有序 | 
| Hashtable | 线程安全 | 过时,不推荐使用 | 
| ConcurrentHashMap | 分段锁 | 并发场景下的高性能 Map | 
| WeakHashMap | 弱引用键 | 用于缓存,键被 GC 回收后自动删除 | 
哈希表(Hash Table)
- 描述:哈希表是一种基于哈希函数的键值对存储结构,支持快速查找、插入和删除操作。
- 优点 :
- 查找速度快,平均时间复杂度为O(1)。
- 动态扩展能力,适合存储大量数据。
- 缺点 :
- 可能发生哈希冲突,需要处理冲突的机制(如链地址法、开放定址法)。
- 内存使用可能较高,特别是在负载因子低时。
- 适用场景:适用于需要快速查找和频繁插入的场景,如缓存、索引等。
4. 树(Tree)
- 描述:树是一种分层数据结构,由节点组成,每个节点有零个或多个子节点。
- 优点 :
- 适合用于表示分层关系的数据。
- 可以高效地进行查找、插入和删除操作(如二叉搜索树)。
- 缺点 :
- 实现复杂,特别是平衡树(如AVL树、红黑树)。
- 适用场景:适用于表示层次结构的数据,如文件系统、组织结构等。
5. 图(Graph)
- 描述:图是一种由节点(顶点)和边组成的数据结构,可以表示复杂的关系。
- 优点 :
- 灵活表示各种关系,适合表示网络结构(如社交网络、地图等)。
- 可以实现多种算法,如最短路径、最小生成树等。
- 缺点 :
- 实现和操作复杂,特别是稠密图和稀疏图。
- 可能需要较多的内存。
- 适用场景:适用于表示复杂关系的数据,如社交网络、交通网络等。
6. 堆(Heap)
- 描述:堆是一种特殊的树形数据结构,分为最大堆和最小堆,主要用于实现优先队列。
- 优点 :
- 支持快速获取最大值或最小值(O(1))。
- 插入和删除操作效率高(O(log n))。
- 缺点 :
- 不支持随机访问。
- 实现较复杂。
- 适用场景:适用于需要动态获取最大值或最小值的场景,如任务调度、图算法等。
✅ 三、队列和栈结构(Queue / Stack)
1. Queue(队列)
| 类型 | 特点 | 
|---|---|
| PriorityQueue | 优先队列,最小堆实现 | 
| ArrayDeque | 双端队列,替代 Stack | 
| LinkedList | 也可作为队列使用 | 
| BlockingQueue(接口) | 支持阻塞操作,用于并发 | 
实现类:
- 
ArrayBlockingQueue
- 
LinkedBlockingQueue
- 
PriorityBlockingQueue
- 
DelayQueue
- 
SynchronousQueue
- 描述:队列是一种先进先出(FIFO)的数据结构,支持入队(enqueue)和出队(dequeue)操作。
- 优点 :
- 操作简单,使用方便,适合任务调度。
- 可以实现循环队列以节省空间。
- 缺点 :
- 只能访问队头元素,其他元素不可直接访问。
- 如果使用数组实现,可能会导致空间浪费。
- 适用场景:适用于任务调度、缓冲区等场景。
2. Stack(栈)
- 
Stack类:继承Vector,线程安全,已被Deque替代
- 
推荐使用 Deque的ArrayDeque实现 LIFO 结构:
            
            
              java
              
              
            
          
          Deque<Integer> stack = new ArrayDeque<>();
- 描述:栈是一种后进先出(LIFO)的数据结构,支持入栈(push)和出栈(pop)操作。
- 优点 :
- 操作简单,使用方便,支持递归调用。
- 适合用于回溯算法。
- 缺点 :
- 只能访问栈顶元素,其他元素不可直接访问。
- 如果栈的实现使用数组,可能会导致栈溢出。
- 适用场景:适用于表达式求值、撤销操作、函数调用等场景。
✅ 四、并发数据结构(java.util.concurrent)
用于高并发场景,线程安全、性能优越:
| 类型 | 描述 | 
|---|---|
| ConcurrentHashMap | 高性能线程安全的 Map | 
| CopyOnWriteArrayList/CopyOnWriteArraySet | 写时复制集合,读多写少场景 | 
| ConcurrentLinkedQueue | 非阻塞队列,CAS 实现 | 
| BlockingQueue | 支持阻塞的线程安全队列 | 
✅ 五、特殊结构与工具类
| 类型 | 描述 | 
|---|---|
| BitSet | 位集合,节省空间,支持位操作 | 
| Properties | 继承 Hashtable,用于配置文件 | 
| EnumMap/EnumSet | 针对枚举类型优化的集合 | 
| TreeMap/TreeSet | 红黑树结构,天然排序 | 
| Collections/Arrays | 工具类,提供排序、查找、同步包装等静态方法 | 
✅六、Streams(Java 8)
虽然不是传统意义上的数据结构,但 Stream 流可以操作集合数据结构:
            
            
              java
              
              
            
          
          List<String> list = Arrays.asList("a", "b", "c"); list.stream().map(String::toUpperCase).collect(Collectors.toList());数据结构操作------时间复杂度
数组访问
- 时间复杂度:O(1)
链表访问
- 时间复杂度:O(n)
栈操作(push/pop)
- 时间复杂度:O(1)
队列操作(enqueue/dequeue)
- 时间复杂度:O(1)
哈希表查找、插入、删除
- 时间复杂度:O(1)(平均情况),O(n)(最坏情况)
平衡树(如AVL树、红黑树)操作
- 时间复杂度:O(log n)
二叉搜索树(BST)操作
- 时间复杂度:O(n)(最坏情况),O(log n)(平均情况)