目录
[✅ 一、线性数据结构](#✅ 一、线性数据结构)
[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)(平均情况)