Hello 算法 1.0.0b1 Java版行文风格约定 标题后标注 * 的是选读章节,内容相对较难。如果你的时间有限,建议可以先跳过。 文章中的重要名词会用「括号」 标注,例如「数组 Array」 。建议记住这些名词,包括英文翻译,以便后续阅 读文献时使用。 重点内容、总起句、总结句会被 加粗,此类文字值得特别关注。 专有名词和有特指含义的词句会使用“双引号” 标注,以避免歧义。 0. 写在前面 hello‑algo.com 4 本书 本书的配套代码托管在GitHub 仓库,源代码包含详细注释,配有测试样例,可以直接运行。 ‧ 若学习时间紧张,建议至少将所有代码通读并运行一遍。 ‧ 若时间允许,强烈建议对照着代码自己敲一遍。相比于读代码,写代码的过程往往能带来新的收获。 0. 写在前面 hello‑algo.com 5 Figure 0‑4. 运行代码示例 第一步:安装本地编程环境。参照附录教程,如果已有可直接跳过。 第二步:下载代码仓。如果已经安装 = firtstElementAddr + elementLength * elementIndex 为什么数组元素索引从 0 开始编号?根据地址计算公式,索引本质上表示的是内存地址偏移量,首个元素的地 址偏移量是 0 ,那么索引是 0 也就很自然了。 访问元素的高效性带来了许多便利。例如,我们可以在 ?(1) 时间内随机获取一个数组中的元素。 // === File: array.java0 码力 | 186 页 | 14.71 MB | 1 年前3
Hello 算法 1.0.0b2 Java版行文风格约定 标题后标注 * 的是选读章节,内容相对较难。如果你的时间有限,建议可以先跳过。 文章中的重要名词会用「括号」 标注,例如「数组 Array」 。建议记住这些名词,包括英文翻译,以便后续阅 读文献时使用。 重点内容、总起句、总结句会被 加粗,此类文字值得特别关注。 专有名词和有特指含义的词句会使用“双引号” 标注,以避免歧义。 0. 写在前面 hello‑algo.com 4 本书 本书的配套代码托管在GitHub 仓库,源代码包含详细注释,配有测试样例,可以直接运行。 ‧ 若学习时间紧张,建议至少将所有代码通读并运行一遍。 ‧ 若时间允许,强烈建议对照着代码自己敲一遍。相比于读代码,写代码的过程往往能带来新的收获。 0. 写在前面 hello‑algo.com 5 Figure 0‑4. 运行代码示例 第一步:安装本地编程环境。参照附录教程,如果已有可直接跳过。 第二步:下载代码仓。如果已经安装 = firtstElementAddr + elementLength * elementIndex 为什么数组元素索引从 0 开始编号?根据地址计算公式,索引本质上表示的是内存地址偏移量,首个元素的地 址偏移量是 0 ,那么索引是 0 也就很自然了。 访问元素的高效性带来了许多便利。例如,我们可以在 ?(1) 时间内随机获取一个数组中的元素。 // === File: array.java0 码力 | 197 页 | 15.72 MB | 1 年前3
Hello 算法 1.1.0 Java版boolean[] bools = new boolean[5]; 3.3 数字编码 * Note 在本书中,标题带有 * 符号的是选读章节。如果你时间有限或感到理解困难,可以先跳过,等学完必 读章节后再单独攻克。 第 3 章 数据结构 hello‑algo.com 56 3.3.1 原码、反码和补码 在上一节的表格中我们发现,所有整数类型能够表示的负数都比正数多一个,例如 byte 的取值范围是 4‑2 数组元素的内存地址计算 观察图 4‑2 ,我们发现数组首个元素的索引为 0 ,这似乎有些反直觉,因为从 1 开始计数会更自然。但从地 址计算公式的角度看,索引本质上是内存地址的偏移量。首个元素的地址偏移量是 0 ,因此它的索引为 0 是 合理的。 在数组中访问元素非常高效,我们可以在 ?(1) 时间内随机访问数组中的任意一个元素。 // === File: array.java === 据,例如 int、double、 string、object 等。 相对地,数组元素则必须是相同类型的,这样才能通过计算偏移量来获取对应元素位置。例如,数组同时包 含 int 和 long 两种类型,单个元素分别占用 4 字节 和 8 字节,此时就不能用以下公式计算偏移量了,因为 数组中包含了两种“元素长度”。 # 元素内存地址 = 数组内存地址(首元素内存地址) + 元素长度 * 元素索引0 码力 | 378 页 | 18.47 MB | 1 年前3
Hello 算法 1.0.0b4 Java版两眼一抹黑地刷题似乎是最受欢迎的方法,简单直接且有效。然而,刷题就如同玩“扫雷”游戏,自学能力 强的同学能够顺利地将地雷逐个排掉,而基础不足的同学很可能被炸的满头是包,并在挫折中步步退缩。通 读教材书籍也是一种常见做法,但对于面向求职的同学来说,毕业季、投递简历、准备笔试面试已经占据了 大部分精力,厚重的书籍往往变成了一项艰巨的挑战。 如果你也面临类似的困扰,那么很幸运这本书找到了你。本 为什么数组元素的索引要从 0 开始编号呢? 观察上图,我们发现数组首个元素的索引为 0 ,这似乎有些反直觉,因为从 1 开始计数会更 自然。 然而,从地址计算公式的角度看,索引本质上表示的是内存地址的偏移量。首个元素的地址偏 移量是 0 ,因此索引为 0 也是合理的。 访问元素的高效性带来了诸多便利。例如,我们可以在 ?(1) 时间内随机获取数组中的任意一个元素。 // === File: array int, double, string, object 等。 相对地,数组元素则必须是相同类型的,这样才能通过计算偏移量来获取对应元素位置。例 如,如果数组同时包含 int 和 long 两种类型,单个元素分别占用 4 bytes 和 8 bytes ,那么此 时就不能用以下公式计算偏移量了,因为数组中包含了两种 elementLength 。 // 元素内存地址 = 数组内存地址 + 元素长度0 码力 | 342 页 | 27.39 MB | 1 年前3
Hello 算法 1.2.0 简体中文 Java 版boolean[] bools = new boolean[5]; 3.3 数字编码 * Tip 在本书中,标题带有 * 符号的是选读章节。如果你时间有限或感到理解困难,可以先跳过,等学完必 读章节后再单独攻克。 第 3 章 数据结构 www.hello‑algo.com 56 3.3.1 原码、反码和补码 在上一节的表格中我们发现,所有整数类型能够表示的负数都比正数多一个,例如 byte 4‑2 数组元素的内存地址计算 观察图 4‑2 ,我们发现数组首个元素的索引为 0 ,这似乎有些反直觉,因为从 1 开始计数会更自然。但从地 址计算公式的角度看,索引本质上是内存地址的偏移量。首个元素的地址偏移量是 0 ,因此它的索引为 0 是 合理的。 在数组中访问元素非常高效,我们可以在 ?(1) 时间内随机访问数组中的任意一个元素。 // === File: array.java === 据,例如 int、double、 string、object 等。 相对地,数组元素则必须是相同类型的,这样才能通过计算偏移量来获取对应元素位置。例如,数组同时包 含 int 和 long 两种类型,单个元素分别占用 4 字节和 8 字节,此时就不能用以下公式计算偏移量了,因为数 组中包含了两种“元素长度”。 # 元素内存地址 = 数组内存地址(首元素内存地址) + 元素长度 * 元素索引0 码力 | 379 页 | 18.48 MB | 10 月前3
JAVA 应用与开发 - 控制台应用程序设计���程序����� System.in 为 InputStream ���������������为 ��从���的��输入�键盘�读���� ������接�作 System.in ���行读��作����� ��为一�����的 InputStreamReader ������为� �读���� InputStreamReader ��������������到 BufferedReader ��� ���������������为 ��从���的��输入�键盘�读���� ������接�作 System.in ���行读��作����� ��为一�����的 InputStreamReader ������为� �读������的��为�InputStreamReader 对象并没有直 接读取键盘输入,而是多次调用 System.in 对象的读字节功能, 再将所得字节转换为字符。 InputStreamReader ��从���的��输入�键盘�读���� ������接�作 System.in ���行读��作����� ��为一�����的 InputStreamReader ������为� �读���� InputStreamReader ��������������到 BufferedReader ����������读�的������� � InputStreamReader 读���作�����读�的����0 码力 | 63 页 | 2.84 MB | 1 年前3
Nacos架构&原理
其实,⼀致性协议,就是用来保证数据⼀致的,而数据的产生,必然有⼀个写入的动作;同时还要 能够读数据,并且保证读数据的动作以及得到的数据结果,并且能够得到⼀致性协议的保障。因此, ⼀致性协议最最基础的两个方法,就是写动作和读动作 public interface ConsistencyProtocolexten ds CommandOperations 协议的主要设计思想如下: Nacos 每个节点是平等的都可以处理写请求,同时把新数据同步到其他节点。 每个节点只负责部分数据,定时发送自己负责数据的校验值到其他节点来保持数据⼀致性。 每个节点独立处理读请求,及时从本地发出响应。 下面几节将分为几个场景进行 Distro 协议工作原理的介绍。 数据初始化 新加入的 Distro 节点会进行全量数据拉取。具体操作是轮询所有的 Distro 节点,通过向其他的机 Sync 任务,将本机所负责的所有的实例信息同步到其他节点上。 读操作 由于每台机器上都存放了全量数据,因此在每⼀次读操作中,Distro 机器会直接从本地拉取数据。 快速响应。 41 > Nacos 架构 这种机制保证了 Distro 协议可以作为⼀种 AP 协议,对于读操作都进行及时的响应。在网络分区 的情况下,对于所有的读操作也能够正常返回;当网络恢复时,各个 Distro 节点会把各数据分片的 0 码力 | 326 页 | 12.83 MB | 9 月前3
基于 Java EE 的企业应用系统设计 - Spring MVC 01JSP 方式 O 仅有的一点优势 1. 无需额外的配置文件,无需框架的帮助,即可完成逻辑。 2. 简单易上手。 O 劣势 1. Java 代码由于混杂在一个 HTML 环境中而显得混乱不堪,可 读性非常差。一个 JSP 文件有时候会变成几十 K,甚至上百 K,经常难以定位逻辑代码的所在。 2. 编写代码时非常困惑,不知道代码到底应该写在哪里,也不 知道别人是不是已经曾经实现过类似的功能,到哪里去引 JSP 方式 O 仅有的一点优势 1. 无需额外的配置文件,无需框架的帮助,即可完成逻辑。 2. 简单易上手。 O 劣势 1. Java 代码由于混杂在一个 HTML 环境中而显得混乱不堪,可 读性非常差。一个 JSP 文件有时候会变成几十 K,甚至上百 K,经常难以定位逻辑代码的所在。 2. 编写代码时非常困惑,不知道代码到底应该写在哪里,也不 知道别人是不是已经曾经实现过类似的功能,到哪里去引 JSP 方式 O 仅有的一点优势 1. 无需额外的配置文件,无需框架的帮助,即可完成逻辑。 2. 简单易上手。 O 劣势 1. Java 代码由于混杂在一个 HTML 环境中而显得混乱不堪,可 读性非常差。一个 JSP 文件有时候会变成几十 K,甚至上百 K,经常难以定位逻辑代码的所在。 2. 编写代码时非常困惑,不知道代码到底应该写在哪里,也不 知道别人是不是已经曾经实现过类似的功能,到哪里去引0 码力 | 67 页 | 792.43 KB | 1 年前3
Java 应用与开发 - 高级 I/O 编程可分为节点流(Node Stream)和处理流(Processing Stream)。 ▶ 节点流直接连接到数据源; ▶ 处理流是对一个已存在的流的连接和封装,通过所封装的流 的功能调用实现增强的数据读/写功能,处理流并不直接连 到数据源。 Howareyou? Imissyou. h o w 文件 read() 节点流FileReader 处理流BufferedReader readLine() 数据以字节流的 形式进行处理,一般用于实现对象的持久性,即长久保存一个对象的状 态并在需要时获取该对象的信息以重新构造一个状态完全相同的对象。 对象序列化可以理解为使用 I/O“对象流”类型实现对象读/写操作。 O 基本概念 ▶ 对象的持久性(Object Persistance) 长久保存一个对象的状态并 在需要时获取该对象的信息以重新构造一个状态完全相同的对象。 ▶ 对象序列化(Object0 码力 | 27 页 | 609.17 KB | 1 年前3
《Java 应用与开发》课程讲义 - 王晓东InputStreamReader 对象并没有直接读取键盘输入,而是多次调用 System.in 对象 的读字节功能,再将所得字节转换为字符。 • InputStreamReader 仍不能令人满意,再次封装,得到 BufferedReader 对象。后者 提供了缓冲读取的功能,即多次调用 InputStreamReader 读字符操作,然后将所读 取的多个字符积累起来组成字符串,其间以换行符为分隔,最终实现以行为单位 文件名,上述代码等 价于: 1 FileReader fr = new FileReader(”test.txt”); 2. 使用 BufferedReader 的 readLine() 方法读文件,遇到文件结尾则返回 null,而不 是"",与读取键盘输入遇到空回车时返回空字符串的情况不同。 . . . . . . . . . . . . . . . . . . . . . . . . 可分为节点流(Node Stream)和处理流(Processing Stream)。 • 节点流直接连接到数据源; • 处理流是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现增强 的数据读/写功能,处理流并不直接连到数据源。 按传输数据的“颗粒大小” 可分为字符流(Character Stream)和字节流(Byte Stream)。 . . . . . . . . . . .0 码力 | 330 页 | 6.54 MB | 1 年前3
共 15 条
- 1
- 2













