Java 中的数据结构--简单汇总

目录

[✅ 一、线性数据结构](#✅ 一、线性数据结构)

[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 的集合框架主要分为三大体系结构:ListSetMap

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 替代

  • 推荐使用 DequeArrayDeque 实现 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)(平均情况)
相关推荐
珹洺12 分钟前
C++从入门到实战(十三)C++函数模板与类模板初阶讲解
开发语言·数据结构·c++·算法
LiLiYuan.12 分钟前
关于Stream
java·开发语言·windows·python
ElseWhereR1 小时前
合并两个有序链表 - 简单
数据结构·链表
hzj61 小时前
GateWay使用
java·spring·gateway
hongyanwin4 小时前
cmake qt 项目编译(win)
开发语言·qt
苹果酱05675 小时前
【Azure Redis】Redis导入备份文件(RDB)失败的原因
java·vue.js·spring boot·mysql·课程设计
每次的天空5 小时前
Android第六次面试总结之Java设计模式(二)
android·java·面试
JAVA百练成神6 小时前
Java引用RabbitMQ快速入门
java·rabbitmq·java-rabbitmq
元亓亓亓6 小时前
Java后端开发day42--IO流(二)--字符集&字符流
java·开发语言
一刀到底2116 小时前
idea内存过低 设置 Maximum Heap Size 终极解决方案
java·ide·intellij-idea