 Nacos架构&原理
 容量管理:管理每个租户,分组下的容量,防止存储被写爆,影响服务可用性。  流量管理:按照租户,分组等多个维度对请求频率,长链接个数,报文大小,请求流控进行控制。  缓存机制:容灾目录,本地缓存,Server 缓存机制,是 Nacos 高可用的关键。  启动模式:按照单机模式,配置模式,服务模式,DNS 模式模式,启动不同的模块。  ⼀致性协议:解决不同数据,不同⼀致性要求情况下,不同⼀致性要求,是 变更快了之后如何管控控制变更风险,如灰度、回滚等  敏感配置如何做安全配置 Nacos 架构 < 22 概念介绍 配置(Configuration) 在系统开发过程中通常会将⼀些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配 置文件的形式存在。目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物 理运行环境进行适配。配置管理⼀般包含在系统部署的过程中,由系统管理员或者运维人员完成这 SDK 会在本地生成配置的快照。当客户端无法连接到 Nacos Server 时,可以使 用配置快照显示系统的整体容灾能力。配置快照类似于 Git 中的本地 commit,也类似于缓存,会 在适当的时机更新,但是并没有缓存过期(expiration)的概念。 Nacos 配置模型 基础模型 上图是 Nacos 配置管理的基础模型: 25 > Nacos 架构 1. Nacos 提供可视化0 码力 | 326 页 | 12.83 MB | 9 月前3 Nacos架构&原理
 容量管理:管理每个租户,分组下的容量,防止存储被写爆,影响服务可用性。  流量管理:按照租户,分组等多个维度对请求频率,长链接个数,报文大小,请求流控进行控制。  缓存机制:容灾目录,本地缓存,Server 缓存机制,是 Nacos 高可用的关键。  启动模式:按照单机模式,配置模式,服务模式,DNS 模式模式,启动不同的模块。  ⼀致性协议:解决不同数据,不同⼀致性要求情况下,不同⼀致性要求,是 变更快了之后如何管控控制变更风险,如灰度、回滚等  敏感配置如何做安全配置 Nacos 架构 < 22 概念介绍 配置(Configuration) 在系统开发过程中通常会将⼀些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配 置文件的形式存在。目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物 理运行环境进行适配。配置管理⼀般包含在系统部署的过程中,由系统管理员或者运维人员完成这 SDK 会在本地生成配置的快照。当客户端无法连接到 Nacos Server 时,可以使 用配置快照显示系统的整体容灾能力。配置快照类似于 Git 中的本地 commit,也类似于缓存,会 在适当的时机更新,但是并没有缓存过期(expiration)的概念。 Nacos 配置模型 基础模型 上图是 Nacos 配置管理的基础模型: 25 > Nacos 架构 1. Nacos 提供可视化0 码力 | 326 页 | 12.83 MB | 9 月前3
 《Java 应用与开发》课程讲义 - 王晓东100 9.5.3 File 类的主要方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 9.5.4 文件 I/O 有关读写类 . . . . . . . . . . . . . . . . . . . . . . . . . . 101 9.5.5 读取文件内容 . . . . . . . . . . . . . . String[] list() • File[] listFiles() 获取常规文件信息操作 • long lastModified() • long length() 9.5.4 文件 I/O 有关读写类 常见的文本文件 I/O 操作的类包括: • java.io.FileReader 类 提供 read() 方法以字符为单位从文件中读入数据。 • java.io.FileWrite 类 IOException 取得客户端的输入流。 • 当用户提交的数据中包含文件上传时,提交的数据可以以二进制编码方式提交到 服务器。 • 当表单既有文本字段还有文件上传时,就需要对此二进制流进行解析,从而分离 出文本和上传文件。 • 可以使用第三方框架/Jar 包实现上传文件的处理,如Apache 的 Common upload 组 件。 注意 当使用 getParameter() 方法后,就无法使用0 码力 | 330 页 | 6.54 MB | 1 年前3 《Java 应用与开发》课程讲义 - 王晓东100 9.5.3 File 类的主要方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 9.5.4 文件 I/O 有关读写类 . . . . . . . . . . . . . . . . . . . . . . . . . . 101 9.5.5 读取文件内容 . . . . . . . . . . . . . . String[] list() • File[] listFiles() 获取常规文件信息操作 • long lastModified() • long length() 9.5.4 文件 I/O 有关读写类 常见的文本文件 I/O 操作的类包括: • java.io.FileReader 类 提供 read() 方法以字符为单位从文件中读入数据。 • java.io.FileWrite 类 IOException 取得客户端的输入流。 • 当用户提交的数据中包含文件上传时,提交的数据可以以二进制编码方式提交到 服务器。 • 当表单既有文本字段还有文件上传时,就需要对此二进制流进行解析,从而分离 出文本和上传文件。 • 可以使用第三方框架/Jar 包实现上传文件的处理,如Apache 的 Common upload 组 件。 注意 当使用 getParameter() 方法后,就无法使用0 码力 | 330 页 | 6.54 MB | 1 年前3
 Apache Shiro 1.2.x Reference Manual 中文翻译Filters 默认过滤器 10.4. Session Management 10.5. JSP Tag Library IV. Auxiliary Support 辅助支持 11. Caching 缓存 12. Concurrency & Multithreading 并发与多线程 13. Testing 测试 14. Custom Subjects 自定义 Subject V. Integration Webapp Tutorial 初学者web应用教程 22. Application Security With Apache Shiro 用Shiro保护你的应用安全 23. CacheManager 缓存管理 24. Apache Shiro Cryptography Features 加密功能 Apache Shiro 1.2.x Reference Manual 中文翻译 3 apache-shiro-1 还有其他的功能来支持和加强这些不同应用环境下安全领域的关注点。特别是对以下的功能 支持: Web支持:Shiro 提供的 web 支持 api ,可以很轻松的保护 web 应用程序的安全。 缓存:缓存是 Apache Shiro 保证安全操作快速、高效的重要手段。 并发:Apache Shiro 支持多线程应用程序的并发特性。 测试:支持单元测试和集成测试,确保代码和预想的一样安全。 "Run0 码力 | 196 页 | 2.34 MB | 1 年前3 Apache Shiro 1.2.x Reference Manual 中文翻译Filters 默认过滤器 10.4. Session Management 10.5. JSP Tag Library IV. Auxiliary Support 辅助支持 11. Caching 缓存 12. Concurrency & Multithreading 并发与多线程 13. Testing 测试 14. Custom Subjects 自定义 Subject V. Integration Webapp Tutorial 初学者web应用教程 22. Application Security With Apache Shiro 用Shiro保护你的应用安全 23. CacheManager 缓存管理 24. Apache Shiro Cryptography Features 加密功能 Apache Shiro 1.2.x Reference Manual 中文翻译 3 apache-shiro-1 还有其他的功能来支持和加强这些不同应用环境下安全领域的关注点。特别是对以下的功能 支持: Web支持:Shiro 提供的 web 支持 api ,可以很轻松的保护 web 应用程序的安全。 缓存:缓存是 Apache Shiro 保证安全操作快速、高效的重要手段。 并发:Apache Shiro 支持多线程应用程序的并发特性。 测试:支持单元测试和集成测试,确保代码和预想的一样安全。 "Run0 码力 | 196 页 | 2.34 MB | 1 年前3
 Apache Shiro参考手册中文版也提供了额外的功能来支持和加强在不同环境下所关注的方面,尤其是以下这些:  Web Support:Shiro 的 web 支持的 API 能够轻松地帮助保护 Web 应用程序。  Caching:缓存是 Apache Shiro 中的第一层公民,来确保安全操作快速而又高效。  Concurrency:Apache Shiro 利用它的并发特性来支持多线程应用程序。  Testin CacheManager 创建并管理其他 Shiro 组件使用的 Cache 实例生命周期。因为 Shiro 能够访问许多后台数据源, 由于身份验证,授权和会话管理,缓存在框架中一直是一流的架构功能,用来在同时使用这些数据源时提高 性能。任何现代开源和/或企业的缓存产品能够被插入到 Shiro 来提供一个快速及高效的用户体验。  Cryptography(org.apache.shiro.crypto 或在一台打印机上的所有操作: printer:*:lp7200 或甚至特定的操作: printer:query, print:lp7200 "*"通配符,","子部件分离器可用于权限的任何部分。 Missing Parts 最后要注意的是权限分配:缺少的部件意味着用户可以访问所有与之匹配的值,换句话说, printer:print 等价于0 码力 | 92 页 | 1.16 MB | 1 年前3 Apache Shiro参考手册中文版也提供了额外的功能来支持和加强在不同环境下所关注的方面,尤其是以下这些:  Web Support:Shiro 的 web 支持的 API 能够轻松地帮助保护 Web 应用程序。  Caching:缓存是 Apache Shiro 中的第一层公民,来确保安全操作快速而又高效。  Concurrency:Apache Shiro 利用它的并发特性来支持多线程应用程序。  Testin CacheManager 创建并管理其他 Shiro 组件使用的 Cache 实例生命周期。因为 Shiro 能够访问许多后台数据源, 由于身份验证,授权和会话管理,缓存在框架中一直是一流的架构功能,用来在同时使用这些数据源时提高 性能。任何现代开源和/或企业的缓存产品能够被插入到 Shiro 来提供一个快速及高效的用户体验。  Cryptography(org.apache.shiro.crypto 或在一台打印机上的所有操作: printer:*:lp7200 或甚至特定的操作: printer:query, print:lp7200 "*"通配符,","子部件分离器可用于权限的任何部分。 Missing Parts 最后要注意的是权限分配:缺少的部件意味着用户可以访问所有与之匹配的值,换句话说, printer:print 等价于0 码力 | 92 页 | 1.16 MB | 1 年前3
 Hello 算法 1.0.0b1 Java版长度不可变 长度可变 内存使用率 占用内存少、缓存局部性好 占用内存多 优势操作 随机访问 插入、删除 � 缓存局部性的简单解释 在计算机中,数据读写速度排序是“硬盘 < 内存 < CPU 缓存”。当我们访问数组元素时,计算 机不仅会加载它,还会缓存其周围的其它数据,从而借助高速缓存来提升后续操作的执行速度。 链表则不然,计算机只能挨个地缓存各个结点,这样的多次“搬运”降低了整体效率。 两种实现都支持栈定义中的各项操作,数组实现额外支持随机访问,但这已经超出栈的定义范畴,一般不会用 到。 时间效率 在数组(列表)实现中,入栈与出栈操作都是在预先分配好的连续内存中操作,具有很好的缓存本地性,效率 很好。然而,如果入栈时超出数组容量,则会触发扩容机制,那么该次入栈操作的时间复杂度为 ?(?) 。 在链表实现中,链表的扩容非常灵活,不存在上述数组扩容时变慢的问题。然而,入栈操作需要初始化结点对 效率更高,这是因为: ‧ 出现最差情况的概率很低:虽然快速排序的最差时间复杂度为 ?(?2) ,不如归并排序,但绝大部分情况 下,快速排序可以达到 ?(? log ?) 的复杂度。 ‧ 缓存使用效率高:哨兵划分操作时,将整个子数组加载入缓存中,访问元素效率很高。而诸如「堆排序」 需要跳跃式访问元素,因此不具有此特性。 ‧ 复杂度的常数系数低:在提及的三种算法中,快速排序的 比较、赋值、交换 三种操作的总体数量最少0 码力 | 186 页 | 14.71 MB | 1 年前3 Hello 算法 1.0.0b1 Java版长度不可变 长度可变 内存使用率 占用内存少、缓存局部性好 占用内存多 优势操作 随机访问 插入、删除 � 缓存局部性的简单解释 在计算机中,数据读写速度排序是“硬盘 < 内存 < CPU 缓存”。当我们访问数组元素时,计算 机不仅会加载它,还会缓存其周围的其它数据,从而借助高速缓存来提升后续操作的执行速度。 链表则不然,计算机只能挨个地缓存各个结点,这样的多次“搬运”降低了整体效率。 两种实现都支持栈定义中的各项操作,数组实现额外支持随机访问,但这已经超出栈的定义范畴,一般不会用 到。 时间效率 在数组(列表)实现中,入栈与出栈操作都是在预先分配好的连续内存中操作,具有很好的缓存本地性,效率 很好。然而,如果入栈时超出数组容量,则会触发扩容机制,那么该次入栈操作的时间复杂度为 ?(?) 。 在链表实现中,链表的扩容非常灵活,不存在上述数组扩容时变慢的问题。然而,入栈操作需要初始化结点对 效率更高,这是因为: ‧ 出现最差情况的概率很低:虽然快速排序的最差时间复杂度为 ?(?2) ,不如归并排序,但绝大部分情况 下,快速排序可以达到 ?(? log ?) 的复杂度。 ‧ 缓存使用效率高:哨兵划分操作时,将整个子数组加载入缓存中,访问元素效率很高。而诸如「堆排序」 需要跳跃式访问元素,因此不具有此特性。 ‧ 复杂度的常数系数低:在提及的三种算法中,快速排序的 比较、赋值、交换 三种操作的总体数量最少0 码力 | 186 页 | 14.71 MB | 1 年前3
 Hello 算法 1.0.0b2 Java版长度不可变 长度可变 内存使用率 占用内存少、缓存局部性好 占用内存多 优势操作 随机访问 插入、删除 � 缓存局部性的简单解释 在计算机中,数据读写速度排序是“硬盘 < 内存 < CPU 缓存”。当我们访问数组元素时,计算 机不仅会加载它,还会缓存其周围的其它数据,从而借助高速缓存来提升后续操作的执行速度。 链表则不然,计算机只能挨个地缓存各个结点,这样的多次“搬运”降低了整体效率。 两种实现都支持栈定义中的各项操作,数组实现额外支持随机访问,但这已经超出栈的定义范畴,一般不会用 到。 时间效率 在数组(列表)实现中,入栈与出栈操作都是在预先分配好的连续内存中操作,具有很好的缓存本地性,效率 很好。然而,如果入栈时超出数组容量,则会触发扩容机制,那么该次入栈操作的时间复杂度为 ?(?) 。 在链表实现中,链表的扩容非常灵活,不存在上述数组扩容时变慢的问题。然而,入栈操作需要初始化结点对 效率更高,这是因为: ‧ 出现最差情况的概率很低:虽然快速排序的最差时间复杂度为 ?(?2) ,不如归并排序,但绝大部分情况 下,快速排序可以达到 ?(? log ?) 的复杂度。 ‧ 缓存使用效率高:哨兵划分操作时,将整个子数组加载入缓存中,访问元素效率很高。而诸如「堆排序」 需要跳跃式访问元素,因此不具有此特性。 ‧ 复杂度的常数系数低:在提及的三种算法中,快速排序的 比较、赋值、交换 三种操作的总体数量最少0 码力 | 197 页 | 15.72 MB | 1 年前3 Hello 算法 1.0.0b2 Java版长度不可变 长度可变 内存使用率 占用内存少、缓存局部性好 占用内存多 优势操作 随机访问 插入、删除 � 缓存局部性的简单解释 在计算机中,数据读写速度排序是“硬盘 < 内存 < CPU 缓存”。当我们访问数组元素时,计算 机不仅会加载它,还会缓存其周围的其它数据,从而借助高速缓存来提升后续操作的执行速度。 链表则不然,计算机只能挨个地缓存各个结点,这样的多次“搬运”降低了整体效率。 两种实现都支持栈定义中的各项操作,数组实现额外支持随机访问,但这已经超出栈的定义范畴,一般不会用 到。 时间效率 在数组(列表)实现中,入栈与出栈操作都是在预先分配好的连续内存中操作,具有很好的缓存本地性,效率 很好。然而,如果入栈时超出数组容量,则会触发扩容机制,那么该次入栈操作的时间复杂度为 ?(?) 。 在链表实现中,链表的扩容非常灵活,不存在上述数组扩容时变慢的问题。然而,入栈操作需要初始化结点对 效率更高,这是因为: ‧ 出现最差情况的概率很低:虽然快速排序的最差时间复杂度为 ?(?2) ,不如归并排序,但绝大部分情况 下,快速排序可以达到 ?(? log ?) 的复杂度。 ‧ 缓存使用效率高:哨兵划分操作时,将整个子数组加载入缓存中,访问元素效率很高。而诸如「堆排序」 需要跳跃式访问元素,因此不具有此特性。 ‧ 复杂度的常数系数低:在提及的三种算法中,快速排序的 比较、赋值、交换 三种操作的总体数量最少0 码力 | 197 页 | 15.72 MB | 1 年前3
 Hello 算法 1.1.0 Java版3 列表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 4.4 内存与缓存 * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 4.5 小结 . . . . . 序便可以访问内存中的数据。 图 3‑2 内存条、内存空间、内存地址 Tip 值得说明的是,将内存比作 Excel 表格是一个简化的类比,实际内存的工作机制比较复杂,涉及地址 空间、内存管理、缓存机制、虚拟内存和物理内存等概念。 内存是所有程序的共享资源,当某块内存被某个程序占用时,则无法被其他程序同时使用了。因此在数据结 构与算法的设计中,内存资源是一个重要的考虑因素。比如,算法所占用的内存峰值不应超过系统剩余空闲 优化数据结构的操作效率。 ‧ 空间效率高:数组为数据分配了连续的内存块,无须额外的结构开销。 ‧ 支持随机访问:数组允许在 ?(1) 时间内访问任何元素。 ‧ 缓存局部性:当访问数组元素时,计算机不仅会加载它,还会缓存其周围的其他数据,从而借助高速缓 存来提升后续操作的执行速度。 连续空间存储是一把双刃剑,其存在以下局限性。 ‧ 插入与删除效率低:当数组中元素较多时,插入与删除操作需要移动大量的元素。0 码力 | 378 页 | 18.47 MB | 1 年前3 Hello 算法 1.1.0 Java版3 列表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 4.4 内存与缓存 * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 4.5 小结 . . . . . 序便可以访问内存中的数据。 图 3‑2 内存条、内存空间、内存地址 Tip 值得说明的是,将内存比作 Excel 表格是一个简化的类比,实际内存的工作机制比较复杂,涉及地址 空间、内存管理、缓存机制、虚拟内存和物理内存等概念。 内存是所有程序的共享资源,当某块内存被某个程序占用时,则无法被其他程序同时使用了。因此在数据结 构与算法的设计中,内存资源是一个重要的考虑因素。比如,算法所占用的内存峰值不应超过系统剩余空闲 优化数据结构的操作效率。 ‧ 空间效率高:数组为数据分配了连续的内存块,无须额外的结构开销。 ‧ 支持随机访问:数组允许在 ?(1) 时间内访问任何元素。 ‧ 缓存局部性:当访问数组元素时,计算机不仅会加载它,还会缓存其周围的其他数据,从而借助高速缓 存来提升后续操作的执行速度。 连续空间存储是一把双刃剑,其存在以下局限性。 ‧ 插入与删除效率低:当数组中元素较多时,插入与删除操作需要移动大量的元素。0 码力 | 378 页 | 18.47 MB | 1 年前3
 Hello 算法 1.0.0 Java版3 列表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 4.4 内存与缓存 * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 4.5 小结 . . . . . ,程序便可以访问内存中的数据。 图 3‑2 内存条、内存空间、内存地址 � 值得说明的是,将内存比作 Excel 表格是一个简化的类比,实际内存的工作机制比较复杂,涉 及地址空间、内存管理、缓存机制、虚拟内存和物理内存等概念。 内存是所有程序的共享资源,当某块内存被某个程序占用时,则无法被其他程序同时使用了。因此在数据结 构与算法的设计中,内存资源是一个重要的考虑因素。比如,算法所占用的内存峰值不应超过系统剩余空闲 优化数据结构的操作效率。 ‧ 空间效率高:数组为数据分配了连续的内存块,无须额外的结构开销。 ‧ 支持随机访问:数组允许在 ?(1) 时间内访问任何元素。 ‧ 缓存局部性:当访问数组元素时,计算机不仅会加载它,还会缓存其周围的其他数据,从而借助高速缓 存来提升后续操作的执行速度。 连续空间存储是一把双刃剑,其存在以下局限性。 ‧ 插入与删除效率低:当数组中元素较多时,插入与删除操作需要移动大量的元素。0 码力 | 376 页 | 17.59 MB | 1 年前3 Hello 算法 1.0.0 Java版3 列表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 4.4 内存与缓存 * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 4.5 小结 . . . . . ,程序便可以访问内存中的数据。 图 3‑2 内存条、内存空间、内存地址 � 值得说明的是,将内存比作 Excel 表格是一个简化的类比,实际内存的工作机制比较复杂,涉 及地址空间、内存管理、缓存机制、虚拟内存和物理内存等概念。 内存是所有程序的共享资源,当某块内存被某个程序占用时,则无法被其他程序同时使用了。因此在数据结 构与算法的设计中,内存资源是一个重要的考虑因素。比如,算法所占用的内存峰值不应超过系统剩余空闲 优化数据结构的操作效率。 ‧ 空间效率高:数组为数据分配了连续的内存块,无须额外的结构开销。 ‧ 支持随机访问:数组允许在 ?(1) 时间内访问任何元素。 ‧ 缓存局部性:当访问数组元素时,计算机不仅会加载它,还会缓存其周围的其他数据,从而借助高速缓 存来提升后续操作的执行速度。 连续空间存储是一把双刃剑,其存在以下局限性。 ‧ 插入与删除效率低:当数组中元素较多时,插入与删除操作需要移动大量的元素。0 码力 | 376 页 | 17.59 MB | 1 年前3
 Hello 算法 1.2.0 简体中文 Java 版3 列表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 4.4 内存与缓存 * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 4.5 小结 . . . . . 序便可以访问内存中的数据。 图 3‑2 内存条、内存空间、内存地址 Tip 值得说明的是,将内存比作 Excel 表格是一个简化的类比,实际内存的工作机制比较复杂,涉及地址 空间、内存管理、缓存机制、虚拟内存和物理内存等概念。 内存是所有程序的共享资源,当某块内存被某个程序占用时,则通常无法被其他程序同时使用了。因此在数 据结构与算法的设计中,内存资源是一个重要的考虑因素。比如,算法所占用的内存峰值不应超过系统剩余 优化数据结构的操作效率。 ‧ 空间效率高:数组为数据分配了连续的内存块,无须额外的结构开销。 ‧ 支持随机访问:数组允许在 ?(1) 时间内访问任何元素。 ‧ 缓存局部性:当访问数组元素时,计算机不仅会加载它,还会缓存其周围的其他数据,从而借助高速缓 存来提升后续操作的执行速度。 连续空间存储是一把双刃剑,其存在以下局限性。 ‧ 插入与删除效率低:当数组中元素较多时,插入与删除操作需要移动大量的元素。0 码力 | 379 页 | 18.48 MB | 10 月前3 Hello 算法 1.2.0 简体中文 Java 版3 列表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 4.4 内存与缓存 * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 4.5 小结 . . . . . 序便可以访问内存中的数据。 图 3‑2 内存条、内存空间、内存地址 Tip 值得说明的是,将内存比作 Excel 表格是一个简化的类比,实际内存的工作机制比较复杂,涉及地址 空间、内存管理、缓存机制、虚拟内存和物理内存等概念。 内存是所有程序的共享资源,当某块内存被某个程序占用时,则通常无法被其他程序同时使用了。因此在数 据结构与算法的设计中,内存资源是一个重要的考虑因素。比如,算法所占用的内存峰值不应超过系统剩余 优化数据结构的操作效率。 ‧ 空间效率高:数组为数据分配了连续的内存块,无须额外的结构开销。 ‧ 支持随机访问:数组允许在 ?(1) 时间内访问任何元素。 ‧ 缓存局部性:当访问数组元素时,计算机不仅会加载它,还会缓存其周围的其他数据,从而借助高速缓 存来提升后续操作的执行速度。 连续空间存储是一把双刃剑,其存在以下局限性。 ‧ 插入与删除效率低:当数组中元素较多时,插入与删除操作需要移动大量的元素。0 码力 | 379 页 | 18.48 MB | 10 月前3
 Hello 算法 1.0.0b4 Java版hello‑algo.com 60 ‧ 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和 后一个网页。双向链表的特性使得这种操作变得简单。 ‧ LRU 算法:在缓存淘汰算法(LRU)中,我们需要快速找到最近最少使用的数据,以及支持快速地添 加和删除节点。这时候使用双向链表就非常合适。 循环链表常被用于需要周期性操作的场景,比如操作系统的资源调度。 ‧ 时 内存使用率 占用内存少、缓存局部性好 占用内存多 优势操作 随机访问 插入、删除 4. 数组与链表 hello‑algo.com 65 数组 链表 访问元素 ?(1) ?(?) 添加元素 ?(?) ?(1) 删除元素 ?(?) ?(1) � 缓存局部性 在计算机中,数据读写速度排序是“硬盘 < 内存 < CPU 缓存”。当我们访问数组元素时,计算 机不仅会加载它,还会缓存其周围的其他数据 ,从而借助高速缓存来提升后续操作的执行速 度。链表则不然,计算机只能挨个地缓存各个节点,这样的多次“搬运”降低了整体效率。 4.4.1. Q & A � 数组存储在栈上和存储在堆上,对时间效率和空间效率是否有影响? 栈内存分配由编译器自动完成,而堆内存由程序员在代码中分配(注意,这里的栈和堆和数据 结构中的栈和堆不是同一概念)。 1. 栈不灵活,分配的内存大小不可更改;堆相对灵活,可以动态分配内存。0 码力 | 342 页 | 27.39 MB | 1 年前3 Hello 算法 1.0.0b4 Java版hello‑algo.com 60 ‧ 浏览器历史:在网页浏览器中,当用户点击前进或后退按钮时,浏览器需要知道用户访问过的前一个和 后一个网页。双向链表的特性使得这种操作变得简单。 ‧ LRU 算法:在缓存淘汰算法(LRU)中,我们需要快速找到最近最少使用的数据,以及支持快速地添 加和删除节点。这时候使用双向链表就非常合适。 循环链表常被用于需要周期性操作的场景,比如操作系统的资源调度。 ‧ 时 内存使用率 占用内存少、缓存局部性好 占用内存多 优势操作 随机访问 插入、删除 4. 数组与链表 hello‑algo.com 65 数组 链表 访问元素 ?(1) ?(?) 添加元素 ?(?) ?(1) 删除元素 ?(?) ?(1) � 缓存局部性 在计算机中,数据读写速度排序是“硬盘 < 内存 < CPU 缓存”。当我们访问数组元素时,计算 机不仅会加载它,还会缓存其周围的其他数据 ,从而借助高速缓存来提升后续操作的执行速 度。链表则不然,计算机只能挨个地缓存各个节点,这样的多次“搬运”降低了整体效率。 4.4.1. Q & A � 数组存储在栈上和存储在堆上,对时间效率和空间效率是否有影响? 栈内存分配由编译器自动完成,而堆内存由程序员在代码中分配(注意,这里的栈和堆和数据 结构中的栈和堆不是同一概念)。 1. 栈不灵活,分配的内存大小不可更改;堆相对灵活,可以动态分配内存。0 码力 | 342 页 | 27.39 MB | 1 年前3
共 22 条
- 1
- 2
- 3













