当前位置: 首页 > news >正文

【数据结构入门】

👉 看 ArrayList 源码,说“基于数组”,但数组到底怎么“动态扩容”?
👉 LinkedList 是“链表”,可链表长什么样?为啥插入快?
👉 HashMap 说“数组 + 链表/红黑树”,红黑树又是啥?看着就头大……

集合框架的底层,其实就是各种数据结构的组合应用


一、什么是数据结构?

简单说:数据结构就是数据的组织方式

就像你整理衣柜:

  • 把衣服叠好堆起来 → 像 数组
  • 衣架一个接一个挂起来 → 像 链表
  • 季节分类放进不同抽屉 → 像 哈希表

好的数据结构,能让“存、取、查、改”更快更省空间!


二、1. 数组(Array)—— 连续的“格子”

🎯 核心特点

  • 内存连续:所有元素在内存中挨着存放
  • 固定长度:创建时必须指定大小,不能变
  • 随机访问快:通过索引 index 直接定位,O(1) 时间
int[] arr = new int[5]; // 创建长度为 5 的数组
arr[0] = 10; // 直接通过索引赋值
int value = arr[2]; // 直接通过索引取值

🖼️ 图示

内存地址: 1000  1004  1008  1012  1016+----+----+----+----+----+
数组 arr: | 10 | ?  | 30 | ?  | ?  |+----+----+----+----+----+
索引:       0    1    2    3    4

优点:查询快(get(index) O(1)
缺点:长度固定,插入/删除慢(要移动后面所有元素)

🔧 在集合中的应用

  • ArrayList基于数组实现,通过“扩容”解决长度固定问题
  • HashMap 的“桶数组”:存储链表或红黑树的根节点

三、2. 链表(Linked List)—— 用“绳子”串起来的珠子

🎯 核心特点

  • 内存不连续:每个节点(Node)分散在内存各处
  • 动态大小:可以随时添加或删除节点
  • 增删快:只要修改“指针”(引用),O(1) 时间(已知节点位置)
  • 查询慢:必须从头开始一个一个找,O(n) 时间

🖼️ 图示:单向链表

      +----+----+    +----+----+    +----+----+
head ->| 10 | --o--->| 20 | --o--->| 30 |null|+----+----+    +----+----+    +----+----+数据  指针      数据  指针      数据  指针

每个节点包含两部分:

  1. 数据域:存实际数据(如 10)
  2. 指针域:存下一个节点的地址(引用)

🖼️ 图示:双向链表(LinkedList 用它)

      +------+----+------+    +------+----+------+    +------+----+------+
head ->| prev | 10 | next |<--->| prev | 20 | next |<--->| prev | 30 | next || null |    |  o---+    +------+----+---o  |    +---o----+----+ null |+------+----+------+                    |         ||                                  |         |+----------------------------------+         ||+--------------------------------------------+

多了一个 prev 指针,指向前一个节点,可以双向遍历

🔧 在集合中的应用

  • LinkedList基于双向链表实现,头尾增删极快
  • HashMap 的“桶”:当多个元素哈希到同一个位置时,用链表串起来

四、3. 栈(Stack)—— 叠盘子

🎯 核心特点

  • 后进先出(LIFO):最后放的盘子,最先拿走
  • 只允许在一端操作:入栈(push) 和 出栈(pop)

🖼️ 图示

       |------|  <- 出栈 (pop)|  C   ||------||  B   ||------||  A   ||------|  <- 入栈 (push)|  底  |

🔧 在集合中的应用

  • ArrayDeque:可以用作push() / pop()
  • 算法:递归、括号匹配、表达式求值

五、4. 队列(Queue)—— 排队买票

🎯 核心特点

  • 先进先出(FIFO):先排队的人,先买到票
  • 一端入队(offer),另一端出队(poll

🖼️ 图示

入队 (offer) -> | A | B | C | D | -> 出队 (poll)头           尾

🖼️ 双端队列(Deque)—— 两头都能进出

左进 -> | A | B | C | D | <- 右进| D | C | B | A | <- 左出
右出 -> | A | B | C | D | <- 左进

🔧 在集合中的应用

  • ArrayDeque基于循环数组实现双端队列,性能高
  • PriorityQueue基于堆实现的优先级队列,按优先级出队

六、5. 哈希表(Hash Table)—— 用“钥匙”找抽屉

🎯 核心思想

  • 给每个“数据”算一个“指纹”(哈希值)
  • 用“指纹”决定它该放在哪个“抽屉”(桶 bucket)

🖼️ 图示:哈希表基本结构

桶数组 (buckets)
+-----------------+
|  bucket 0  | -> | A:10 | -> | E:50 |  (链表法解决冲突)
+-----------------+
|  bucket 1  | -> | B:20 |
+-----------------+
|  bucket 2  | -> null
+-----------------+
|  bucket 3  | -> | C:30 | -> | F:60 | -> | G:70 |
+-----------------+
|  bucket 4  | -> | D:40 |
+-----------------+
🔍 步骤:
  1. 计算哈希hash("A") = 0
  2. 定位桶:放入 bucket 0
  3. 解决冲突:如果 hash("E") 也等于 0,就用链表串起来(拉链法)

🔧 在集合中的应用

  • HashMap / HashSet核心就是哈希表
  • LinkedHashMap:哈希表 + 双向链表(维护顺序)

七、6. 树(Tree)—— 层层分级的组织结构

🎯 核心概念

  • 根节点(Root):最顶层,只有一个
  • 父节点、子节点:上下级关系
  • 叶子节点(Leaf):没有子节点
  • 深度(Depth):从根到节点的边数

🖼️ 图示:普通树

        A        <- 根节点/ | \B  C  D     <- 内部节点/ \    |E   F   G     <- 叶子节点

🖼️ 二叉树(Binary Tree)—— 每个节点最多两个孩子

        5/ \3   8/ \   \2   4   9

八、7. 二叉搜索树(BST)—— 自动排序的二叉树

🎯 核心规则

  • 左子树所有节点 < 根节点
  • 右子树所有节点 > 根节点
  • 左右子树也都是 BST

🖼️ 图示

        5/ \3   8/ \   \2   4   9/1

优点:查找、插入、删除平均 O(log n)
缺点:可能退化成链表(如插入 1,2,3,4,5)


九、8. 平衡二叉树(AVL Tree)—— 自动“瘦身”的 BST

🎯 核心思想

  • 在 BST 基础上,左右子树高度差不超过 1
  • 插入/删除后,通过“旋转”保持平衡

优点:严格平衡,查找稳定 O(log n)
缺点:旋转操作稍复杂,插入删除可能稍慢


十、9. 红黑树(Red-Black Tree)—— “近似平衡”的 BST

🎯 核心规则(5条)

  1. 节点是红色或黑色
  2. 根节点是黑色
  3. 所有叶子(null)是黑色
  4. 红色节点的子节点必须是黑色(不能有两个连续红节点)
  5. 从任一节点到其每个叶子的所有路径包含相同数目的黑色节点

🖼️ 图示(简化)

        B(5)/    \R(3)   B(8)/ \      \B(2) B(4)  R(9)/B(1)

优点

  • 近似平衡,查找、插入、删除 O(log n)
  • 旋转比 AVL 少,综合性能更好

🔧 在集合中的应用

  • TreeMap / TreeSet基于红黑树实现,自动排序
  • HashMap(JDK 8+):当链表长度 > 8 且数组长度 ≥ 64 时,链表转红黑树,防止查找退化到 O(n)

十一、总结:一张表搞懂数据结构与集合的对应关系

数据结构特点在 Java 集合中的应用
数组连续内存,查询快,增删慢ArrayListHashMap 的桶数组
链表内存分散,增删快,查询慢LinkedListHashMap 的冲突链表
LIFO(后进先出)ArrayDeque(可用作栈)
队列FIFO(先进先出)ArrayDequePriorityQueue
哈希表通过哈希快速定位HashMapHashSetLinkedHashMap
红黑树近似平衡,有序,O(log n)TreeMapTreeSetHashMap(链表转树)

🔚 最后一句话

数据结构是“内功”,集合框架是“招式”
只有理解了数组、链表、哈希表、红黑树这些“内功心法”,
你才能真正看懂 ArrayListHashMapTreeSet 这些“绝世武功”的精妙之处。
掌握它,你才能从“调用 API”升级到“理解设计、优化性能、写出大师级代码”!

希望这篇图文并茂的数据结构入门,能帮你扫清集合框架学习路上的障碍!

http://www.dtcms.com/a/331041.html

相关文章:

  • 移动机器人底盘在高校科研中的AI智能教育应用
  • (第十五期)HTML文本格式化标签详解:让文字更有表现力
  • Flutter GetX 全面指南:状态管理、路由与依赖注入的最佳实践
  • SpringMVC请求与响应
  • 三坐标测量仪:从机械精密到智能协同的技术
  • flutter 开发 鸿蒙 App
  • gitee_配置自动部署vue项目
  • Uniapp 获取系统信息:uni.getSystemInfo 与 uni.getSystemInfoSync
  • vs2022 opencv环境配置(使用相对地址-将依赖都放入项目中)
  • spring boot配置es
  • 开发避坑指南(26):Vue3 input输入框前置后 置元素解决方案
  • 新增和编辑共用弹窗模板
  • .Net Core控制台程序连接HGDB并部署到Linux
  • 【C#】跨平台创建你的WinForms窗体应用(WindowsUbuntu)
  • 上网行为安全概述和组网方案
  • 深入解析 HTTP 协议演进:从 1.0 到 3.0
  • 【web站点安全开发】任务4:JavaScript与HTML/CSS的完美协作指南
  • 嵌入式Linux学习-编译内核源码
  • vscode的ws环境,esp32s3连接wifi
  • 深入解析Python身份切换:安全权限管理实践指南
  • MyBatis缓存模块深度解析
  • dolphinscheduler中任务输出变量的问题出现ArrayIndexOutOfBoundsException
  • MCP和Agent之间的区别和联系
  • vercel部署上线
  • lesson38:MySQL数据库核心操作详解:从基础查询到高级应用
  • 飞算JavaAI智慧零售场景实践:从用户洞察到供应链优化的全链路技术升级
  • UniApp 中使用 tui-xecharts插件(或类似图表库如 uCharts)
  • [ HTML 前端 ] 语法介绍和HBuilderX安装
  • 通过网页调用身份证阅读器http websocket方法-湖南步联科技美萍MP999A电子————仙盟创梦IDE
  • 15 ABP Framework 开发工具