 Nacos架构&原理
38 Nacos 通信通道 42 Nacos 寻址机制 56 Nacos 服务发现模块 63 Nacos 注册中心的设计原理 63 Nacos 注册中心服务数据模型 80 Nacos 健康检查机制 89 Nacos 配置管理模块 97 配置⼀致性模型 97 Nacos ⾼可⽤设计 100 Nacos 高可用设计 100 Nacos 鉴权插件 103 Nacos 账号权限体系 103 Agent:Sidecar 模式运行,通过标准 DNS 协议与业务解耦。  CLI:命令行对产品进行轻量化管理,像 git ⼀样好用。 业务层  服务管理:实现服务 CRUD,域名 CRUD,服务健康状态检查,服务权重管理等功能。  配置管理:实现配置管 CRUD,版本管理,灰度管理,监听管理,推送轨迹,聚合数据等功能。  元数据管理:提供元数据 CURD 和打标能力,为实现上层流量和服务灰度非常关键。 服务实 例续约)。而对于 Nacos 服务发现注册中的持久化服务,因为所有的数据都是直接使用调用 Nacos 服务端直接创建,因此需要由 Nacos 保障数据在各个节点之间的强⼀致性,故而针对此类型的服务 数据,选择了强⼀致性共识算法来保障数据的⼀致性。 从配置管理来看 配置数据,是直接在 Nacos 服务端进行创建并进行管理的,必须保证大部分的节点都保存了此配 置数据才能认为配置被成0 码力 | 326 页 | 12.83 MB | 9 月前3 Nacos架构&原理
38 Nacos 通信通道 42 Nacos 寻址机制 56 Nacos 服务发现模块 63 Nacos 注册中心的设计原理 63 Nacos 注册中心服务数据模型 80 Nacos 健康检查机制 89 Nacos 配置管理模块 97 配置⼀致性模型 97 Nacos ⾼可⽤设计 100 Nacos 高可用设计 100 Nacos 鉴权插件 103 Nacos 账号权限体系 103 Agent:Sidecar 模式运行,通过标准 DNS 协议与业务解耦。  CLI:命令行对产品进行轻量化管理,像 git ⼀样好用。 业务层  服务管理:实现服务 CRUD,域名 CRUD,服务健康状态检查,服务权重管理等功能。  配置管理:实现配置管 CRUD,版本管理,灰度管理,监听管理,推送轨迹,聚合数据等功能。  元数据管理:提供元数据 CURD 和打标能力,为实现上层流量和服务灰度非常关键。 服务实 例续约)。而对于 Nacos 服务发现注册中的持久化服务,因为所有的数据都是直接使用调用 Nacos 服务端直接创建,因此需要由 Nacos 保障数据在各个节点之间的强⼀致性,故而针对此类型的服务 数据,选择了强⼀致性共识算法来保障数据的⼀致性。 从配置管理来看 配置数据,是直接在 Nacos 服务端进行创建并进行管理的,必须保证大部分的节点都保存了此配 置数据才能认为配置被成0 码力 | 326 页 | 12.83 MB | 9 月前3
 Apache Shiro参考手册中文版Beans。并且,任何客户端技术现在能够共享会话数据。 因此,现在你能获取一个 Subject 以及他们的 Session。如果他们被允许做某些事,如对角色和权限的检查,像“检 查”真正有用的地方在哪呢? 嗯,我们只能为一个已知的用户做这些检查。我们上面的 Subject 实例代表了当前用户,但谁又是当前用户?呃, 他们是匿名的——也就是说,直到直到他们至少登录一次。那么,让我像下面这样做: 这就是了!它再简单不过了。 但如果他们的登录尝试失败了会怎样?你能够捕获各种具体的异常来告诉你到底发生了什么,并允许你去处理并作 出相应反应: 你能够检查到许多不同类型的异常,或抛出你自己的自定义条件的异常——Shiro 可能不提供的。请参见 AuthenticationException JavaDoc 获取更多。 Handy Hint ? 比方说,他们是是谁: 我们也可以测试他们是否有特定的角色: 我们还可以判断他们是否有权限在一个确定类型的实体上进行操作: 当然,我们可以执行极其强大的实例级权限检查——判断用户是否有能力访问某一类型的特定实例的能力: 小菜一碟,对吧? 最后,当用户完成了对应用程序的使用,他们可以注销: Final Tutorial0 码力 | 92 页 | 1.16 MB | 1 年前3 Apache Shiro参考手册中文版Beans。并且,任何客户端技术现在能够共享会话数据。 因此,现在你能获取一个 Subject 以及他们的 Session。如果他们被允许做某些事,如对角色和权限的检查,像“检 查”真正有用的地方在哪呢? 嗯,我们只能为一个已知的用户做这些检查。我们上面的 Subject 实例代表了当前用户,但谁又是当前用户?呃, 他们是匿名的——也就是说,直到直到他们至少登录一次。那么,让我像下面这样做: 这就是了!它再简单不过了。 但如果他们的登录尝试失败了会怎样?你能够捕获各种具体的异常来告诉你到底发生了什么,并允许你去处理并作 出相应反应: 你能够检查到许多不同类型的异常,或抛出你自己的自定义条件的异常——Shiro 可能不提供的。请参见 AuthenticationException JavaDoc 获取更多。 Handy Hint ? 比方说,他们是是谁: 我们也可以测试他们是否有特定的角色: 我们还可以判断他们是否有权限在一个确定类型的实体上进行操作: 当然,我们可以执行极其强大的实例级权限检查——判断用户是否有能力访问某一类型的特定实例的能力: 小菜一碟,对吧? 最后,当用户完成了对应用程序的使用,他们可以注销: Final Tutorial0 码力 | 92 页 | 1.16 MB | 1 年前3
 Apache Shiro 1.2.x Reference Manual 中文翻译Stateful Session,并且,终端可以共享 session 数据。 现在你可以获取一个 Subject 和它们的 Session,真正填充有用的代码如检测其是否被允许做 某些事情如何?比如检查其角色和权限? 我们只能对一个已知用户做这些检测,如上我们获取 Subject 实例表示当前用户,但是当前用 户是认证,嗯,他们是任何人--直到他们至少登录一次,我们现在就做这件事情: Apache //password 不匹配,再输入? } catch ( LockedAccountException lae ) { //账号锁住了,不能登入。给个提示? } ... 更多类型异常 ... } catch ( AuthenticationException ae ) { //未考虑到的问题 - 错误? } 这里有许多不同类别的异常你可以检测到,也可以抛出你自己异常。详见 rings are for schwartz masters only."); } 同样,我们还可以执行非常强大的 instance-level (实例级别)的权限检测,检测用户是否具 备访问某个类型特定实例的权限: if ( currentUser.isPermitted( "winnebago:drive:eagle5" ) ) { log.info("You are permitted0 码力 | 196 页 | 2.34 MB | 1 年前3 Apache Shiro 1.2.x Reference Manual 中文翻译Stateful Session,并且,终端可以共享 session 数据。 现在你可以获取一个 Subject 和它们的 Session,真正填充有用的代码如检测其是否被允许做 某些事情如何?比如检查其角色和权限? 我们只能对一个已知用户做这些检测,如上我们获取 Subject 实例表示当前用户,但是当前用 户是认证,嗯,他们是任何人--直到他们至少登录一次,我们现在就做这件事情: Apache //password 不匹配,再输入? } catch ( LockedAccountException lae ) { //账号锁住了,不能登入。给个提示? } ... 更多类型异常 ... } catch ( AuthenticationException ae ) { //未考虑到的问题 - 错误? } 这里有许多不同类别的异常你可以检测到,也可以抛出你自己异常。详见 rings are for schwartz masters only."); } 同样,我们还可以执行非常强大的 instance-level (实例级别)的权限检测,检测用户是否具 备访问某个类型特定实例的权限: if ( currentUser.isPermitted( "winnebago:drive:eagle5" ) ) { log.info("You are permitted0 码力 | 196 页 | 2.34 MB | 1 年前3
 Java 应用与开发 - Servlet 编程E 和 HEAD。 ▶ Web 响应一般情况下是 HTML 文档,也可以是其他类型资 源。 ▶ Web 使用 MIME (Multipurpose Internet mail Extensions) 标准来确定具体的响应类型。HTTP 响应总体上分为两类: 文本类型(纯文本字符、HTML、XML)和二进制原始类型 (图片、声音、视频)。 大纲 Web 基础 Servlet 概述 Servlet doGet 方法。 Servlet 的主要功能 ▶ 接收用户 HTTP 请求。 ▶ 取得 HTTP 请求提交的数据。 ▶ 调用 JavaBean 对象的方法。 ▶ 生成 HTML 类型或非 HTML 类型的 HTTP 动态响应。 ▶ 实现其他 Web 组件的跳转,包括重定向和转发。 大纲 Web 基础 Servlet 概述 Servlet 编程 Servlet 生命周期 Servlet 的运行过程 1. 用户在浏览器请求 ServletURL 地址。 2. Web 容器接收到请求,检查是 Servlet 请求,将处理交给 Servlet 引擎。 3. Servlet 引擎根据 URL 地址检查是否有 Servlet 映射,如果 没有则返回错误信息给浏览器。 4. 有 servlet 映射时,先检查是否有实例在运行。 5. 如果没有实例运行,则创建 Servlet 类的对象,调用其构造0 码力 | 50 页 | 725.36 KB | 1 年前3 Java 应用与开发 - Servlet 编程E 和 HEAD。 ▶ Web 响应一般情况下是 HTML 文档,也可以是其他类型资 源。 ▶ Web 使用 MIME (Multipurpose Internet mail Extensions) 标准来确定具体的响应类型。HTTP 响应总体上分为两类: 文本类型(纯文本字符、HTML、XML)和二进制原始类型 (图片、声音、视频)。 大纲 Web 基础 Servlet 概述 Servlet doGet 方法。 Servlet 的主要功能 ▶ 接收用户 HTTP 请求。 ▶ 取得 HTTP 请求提交的数据。 ▶ 调用 JavaBean 对象的方法。 ▶ 生成 HTML 类型或非 HTML 类型的 HTTP 动态响应。 ▶ 实现其他 Web 组件的跳转,包括重定向和转发。 大纲 Web 基础 Servlet 概述 Servlet 编程 Servlet 生命周期 Servlet 的运行过程 1. 用户在浏览器请求 ServletURL 地址。 2. Web 容器接收到请求,检查是 Servlet 请求,将处理交给 Servlet 引擎。 3. Servlet 引擎根据 URL 地址检查是否有 Servlet 映射,如果 没有则返回错误信息给浏览器。 4. 有 servlet 映射时,先检查是否有实例在运行。 5. 如果没有实例运行,则创建 Servlet 类的对象,调用其构造0 码力 | 50 页 | 725.36 KB | 1 年前3
 《Java 应用与开发》课程讲义 - 王晓东. . . . . . . . . . . . . . . . . . . . . . . 10 2.1.1 数据类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.1.2 数据类型转换 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 7.5 枚举类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 iv 7.5.1 枚举类型的概念 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 7.5.2 遍历枚举类型常量值 . . . . . . . . . . . . . . . . . . . . . . . . . . 81 7.5.3 组合使用枚举类型与 switch . . . . . . . . . . . . . . . . . . . . . . 81 7.6 课后习题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 820 码力 | 330 页 | 6.54 MB | 1 年前3 《Java 应用与开发》课程讲义 - 王晓东. . . . . . . . . . . . . . . . . . . . . . . 10 2.1.1 数据类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.1.2 数据类型转换 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 7.5 枚举类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 iv 7.5.1 枚举类型的概念 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 7.5.2 遍历枚举类型常量值 . . . . . . . . . . . . . . . . . . . . . . . . . . 81 7.5.3 组合使用枚举类型与 switch . . . . . . . . . . . . . . . . . . . . . . 81 7.6 课后习题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 820 码力 | 330 页 | 6.54 MB | 1 年前3
 跟我学Shiro - 张开涛} @Override public boolean supports(AuthenticationToken token) { //仅支持 UsernamePasswordToken 类型的 Token return token instanceof UsernamePasswordToken; } @Override public 进行循环判断,如果匹配如 isPermitted*/hasRole*会返回 true,否 则返回 false 表示授权失败。 ModularRealmAuthorizer 进行多 Realm 匹配流程: 1、首先检查相应的 Realm 是否实现了实现了 Authorizer; 2、如果实现了 Authorizer,那么接着调用其相应的 isPermitted*/hasRole*接口进行匹配; 3、如果有一个 空参构造器,通过反射创建相应的实例。 常量值 setter 注入 会自动调用 jdbcRealm.setPermissionsLookupEnabled(true),对于这种常量值会自动类型转 换。 对象引用 setter 注入 [main] #提供了对根对象 securityManager 及其依赖的配置 securityManager=org.apache0 码力 | 219 页 | 4.16 MB | 10 月前3 跟我学Shiro - 张开涛} @Override public boolean supports(AuthenticationToken token) { //仅支持 UsernamePasswordToken 类型的 Token return token instanceof UsernamePasswordToken; } @Override public 进行循环判断,如果匹配如 isPermitted*/hasRole*会返回 true,否 则返回 false 表示授权失败。 ModularRealmAuthorizer 进行多 Realm 匹配流程: 1、首先检查相应的 Realm 是否实现了实现了 Authorizer; 2、如果实现了 Authorizer,那么接着调用其相应的 isPermitted*/hasRole*接口进行匹配; 3、如果有一个 空参构造器,通过反射创建相应的实例。 常量值 setter 注入 会自动调用 jdbcRealm.setPermissionsLookupEnabled(true),对于这种常量值会自动类型转 换。 对象引用 setter 注入 [main] #提供了对根对象 securityManager 及其依赖的配置 securityManager=org.apache0 码力 | 219 页 | 4.16 MB | 10 月前3
 Java 应用与开发 - 类加载和反射类的加载、连接和初始化 类加载器 使用反射生成并操作对象 本节习题 大纲 反射 类的加载、连接和初始化 类加载器 使用反射生成并操作对象 本节习题 反射机制 ▶ 程序运行时,允许改变程序结构或变量类型,这种语言称为 动态语言。从这个观点看,Perl、Python、Ruby 是动态语 言,C++、Java、C# 不是动态语言。 ▶ 但是 Java 有着一个非常突出的动态相关机制:反射 (Refl 的实例;实际上,这两个类都是 URLClassLoader 的实例。 大纲 反射 类的加载、连接和初始化 类加载器 使用反射生成并操作对象 本节习题 类加载器加载 Class 的大致步骤 1. 检查此 Class 是否载入过(即缓存中是否存在),如果有则 直接进入第 8 步,否则进入第 2 步。 2. 如果父加载器不存在(如果父加载器不存在,要么 parent 一定是根加载器,要么本身就是根加载器),则跳到第 getClass() 方法,该方法是 java.lang.Object 类的一个方法,该方法会返回该对象所属 类对应的 Class 对象。 第二种方式更建议使用,具有两个优势: ▶ 代码更安全,程序在编译阶段就可以检查需要访问的 Class 对象是否存在。 ▶ 程序性能更高,因为这种方式无需调用方法,所以具有更好 的性能。 大纲 反射 类的加载、连接和初始化 类加载器 使用反射生成并操作对象 本节习题 使用反射生成并操作对象0 码力 | 46 页 | 714.40 KB | 1 年前3 Java 应用与开发 - 类加载和反射类的加载、连接和初始化 类加载器 使用反射生成并操作对象 本节习题 大纲 反射 类的加载、连接和初始化 类加载器 使用反射生成并操作对象 本节习题 反射机制 ▶ 程序运行时,允许改变程序结构或变量类型,这种语言称为 动态语言。从这个观点看,Perl、Python、Ruby 是动态语 言,C++、Java、C# 不是动态语言。 ▶ 但是 Java 有着一个非常突出的动态相关机制:反射 (Refl 的实例;实际上,这两个类都是 URLClassLoader 的实例。 大纲 反射 类的加载、连接和初始化 类加载器 使用反射生成并操作对象 本节习题 类加载器加载 Class 的大致步骤 1. 检查此 Class 是否载入过(即缓存中是否存在),如果有则 直接进入第 8 步,否则进入第 2 步。 2. 如果父加载器不存在(如果父加载器不存在,要么 parent 一定是根加载器,要么本身就是根加载器),则跳到第 getClass() 方法,该方法是 java.lang.Object 类的一个方法,该方法会返回该对象所属 类对应的 Class 对象。 第二种方式更建议使用,具有两个优势: ▶ 代码更安全,程序在编译阶段就可以检查需要访问的 Class 对象是否存在。 ▶ 程序性能更高,因为这种方式无需调用方法,所以具有更好 的性能。 大纲 反射 类的加载、连接和初始化 类加载器 使用反射生成并操作对象 本节习题 使用反射生成并操作对象0 码力 | 46 页 | 714.40 KB | 1 年前3
 Java 应用与开发 - 异常处理Programming Language》 ▶ 一个库的作者可以检测出发生了运行时错误,但一般不知道 怎样去处理它们(因为和用户具体的应用有关); ▶ 另一方面,库的用户知道怎样处理这些错误,但却无法检查 它们何时发生(如果能检测,就可以再用户的代码里处理 了,不用留给库去发现)。 提供异常处理机制的的基本思想 让一个函数在发现了自己无法处理的错误时抛出(throw)一个 异常,然后它的(直接或者间接)调用者能够处理这个问题。 Programming Language》 ▶ 一个库的作者可以检测出发生了运行时错误,但一般不知道 怎样去处理它们(因为和用户具体的应用有关); ▶ 另一方面,库的用户知道怎样处理这些错误,但却无法检查 它们何时发生(如果能检测,就可以再用户的代码里处理 了,不用留给库去发现)。 提供异常处理机制的的基本思想 让一个函数在发现了自己无法处理的错误时抛出(throw)一个 异常,然后它的(直接或者间接)调用者能够处理这个问题。 Programming Language》 ▶ 一个库的作者可以检测出发生了运行时错误,但一般不知道 怎样去处理它们(因为和用户具体的应用有关); ▶ 另一方面,库的用户知道怎样处理这些错误,但却无法检查 它们何时发生(如果能检测,就可以再用户的代码里处理 了,不用留给库去发现)。 提供异常处理机制的的基本思想 让一个函数在发现了自己无法处理的错误时抛出(throw)一个 异常,然后它的(直接或者间接)调用者能够处理这个问题。0 码力 | 33 页 | 626.40 KB | 1 年前3 Java 应用与开发 - 异常处理Programming Language》 ▶ 一个库的作者可以检测出发生了运行时错误,但一般不知道 怎样去处理它们(因为和用户具体的应用有关); ▶ 另一方面,库的用户知道怎样处理这些错误,但却无法检查 它们何时发生(如果能检测,就可以再用户的代码里处理 了,不用留给库去发现)。 提供异常处理机制的的基本思想 让一个函数在发现了自己无法处理的错误时抛出(throw)一个 异常,然后它的(直接或者间接)调用者能够处理这个问题。 Programming Language》 ▶ 一个库的作者可以检测出发生了运行时错误,但一般不知道 怎样去处理它们(因为和用户具体的应用有关); ▶ 另一方面,库的用户知道怎样处理这些错误,但却无法检查 它们何时发生(如果能检测,就可以再用户的代码里处理 了,不用留给库去发现)。 提供异常处理机制的的基本思想 让一个函数在发现了自己无法处理的错误时抛出(throw)一个 异常,然后它的(直接或者间接)调用者能够处理这个问题。 Programming Language》 ▶ 一个库的作者可以检测出发生了运行时错误,但一般不知道 怎样去处理它们(因为和用户具体的应用有关); ▶ 另一方面,库的用户知道怎样处理这些错误,但却无法检查 它们何时发生(如果能检测,就可以再用户的代码里处理 了,不用留给库去发现)。 提供异常处理机制的的基本思想 让一个函数在发现了自己无法处理的错误时抛出(throw)一个 异常,然后它的(直接或者间接)调用者能够处理这个问题。0 码力 | 33 页 | 626.40 KB | 1 年前3
 Java 对象的创建过程简单来说Java对象的创建过程总共分为5步: Java创建对象的过程 类加载检查 首先当虚拟机遇到一个new指令时,首先会去检查这个参数能否在常量池中定位到这个类的符号引用 并且检查这个符号引用所代表的的类是否已经被加载、连接、解析和初始化过,如果没有需要先执行 的加载操作(详细过程可参考"类的加载流程" )。 分配内存 当类加载检查通过后,接下来虚拟机需要为新生对象分配内存,为对象分配空间的任务等同于把一块 配 初始化零值 内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值(不包括对象头),这一步操作保 了对象的实例字段在 Java 代码中可以不赋初始值就直接使用,程序能访问到这些字段的数据类型所 应的零值。 设置对象头 初始化零值完成之后,虚拟机要对对象进行必要的设置 ,例如这个对象是哪个类的实例、如何才能找 类的元数据信息、对象的哈希码、对象的 GC 分代年龄等信息。 这些信息存放在对象头中。 如果使用句柄的话,那么 Java 堆中将会划分出一块内存来作为句柄池,reference 中存储的 是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息; 直接指针:如果使用直接指针访问,那么 Java 堆对象的布局中就必须考虑如何放置访问类型数据的 关信息,而 reference 中存储的直接就是对象的地址。具体寻址过程如下图所示: 原文链接:Java 对象的创建过程 这两种0 码力 | 4 页 | 389.87 KB | 1 年前3 Java 对象的创建过程简单来说Java对象的创建过程总共分为5步: Java创建对象的过程 类加载检查 首先当虚拟机遇到一个new指令时,首先会去检查这个参数能否在常量池中定位到这个类的符号引用 并且检查这个符号引用所代表的的类是否已经被加载、连接、解析和初始化过,如果没有需要先执行 的加载操作(详细过程可参考"类的加载流程" )。 分配内存 当类加载检查通过后,接下来虚拟机需要为新生对象分配内存,为对象分配空间的任务等同于把一块 配 初始化零值 内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值(不包括对象头),这一步操作保 了对象的实例字段在 Java 代码中可以不赋初始值就直接使用,程序能访问到这些字段的数据类型所 应的零值。 设置对象头 初始化零值完成之后,虚拟机要对对象进行必要的设置 ,例如这个对象是哪个类的实例、如何才能找 类的元数据信息、对象的哈希码、对象的 GC 分代年龄等信息。 这些信息存放在对象头中。 如果使用句柄的话,那么 Java 堆中将会划分出一块内存来作为句柄池,reference 中存储的 是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息; 直接指针:如果使用直接指针访问,那么 Java 堆对象的布局中就必须考虑如何放置访问类型数据的 关信息,而 reference 中存储的直接就是对象的地址。具体寻址过程如下图所示: 原文链接:Java 对象的创建过程 这两种0 码力 | 4 页 | 389.87 KB | 1 年前3
 Hello 算法 1.0.0b5 Java版3.1 数据结构分类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 3.2 基本数据类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 3.3 数字编码 * . . . . 本书主要内容如图 0‑1 所示。 ‧ 复杂度分析:数据结构和算法的评价维度与方法。时间复杂度、空间复杂度的推算方法、常见类型、示 例等。 ‧ 数据结构:基本数据类型,数据结构的分类方法。数组、链表、栈、队列、哈希表、树、堆、图等数据 结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。 ‧ 算法:搜索、排序、分治、回溯、动态规划、贪心等算法的定义、优缺点、效率、应用场景、解题步骤、 关注。 ‧ 当涉及到编程语言之间不一致的名词时,本书均以 Python 为准,例如使用 None 来表示“空”。 ‧ 本书部分放弃了编程语言的注释规范,以换取更加紧凑的内容排版。注释主要分为三种类型:标题注 释、内容注释、多行注释。 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行 * 注释 */ 0.2.2 在动画图解中高效学习0 码力 | 376 页 | 30.69 MB | 1 年前3 Hello 算法 1.0.0b5 Java版3.1 数据结构分类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 3.2 基本数据类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 3.3 数字编码 * . . . . 本书主要内容如图 0‑1 所示。 ‧ 复杂度分析:数据结构和算法的评价维度与方法。时间复杂度、空间复杂度的推算方法、常见类型、示 例等。 ‧ 数据结构:基本数据类型,数据结构的分类方法。数组、链表、栈、队列、哈希表、树、堆、图等数据 结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。 ‧ 算法:搜索、排序、分治、回溯、动态规划、贪心等算法的定义、优缺点、效率、应用场景、解题步骤、 关注。 ‧ 当涉及到编程语言之间不一致的名词时,本书均以 Python 为准,例如使用 None 来表示“空”。 ‧ 本书部分放弃了编程语言的注释规范,以换取更加紧凑的内容排版。注释主要分为三种类型:标题注 释、内容注释、多行注释。 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行 * 注释 */ 0.2.2 在动画图解中高效学习0 码力 | 376 页 | 30.69 MB | 1 年前3
共 42 条
- 1
- 2
- 3
- 4
- 5













