From cb5ad6953b3aaa235e463e163b874dff634920ec Mon Sep 17 00:00:00 2001 From: guide Date: Mon, 15 Aug 2022 12:31:05 +0800 Subject: [PATCH] =?UTF-8?q?[docs=20update]=E5=9C=A8=E7=BA=BF=E9=98=85?= =?UTF-8?q?=E8=AF=BB=E7=BD=91=E7=AB=99=E9=A6=96=E9=A1=B5&=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E4=B8=BB=E9=A1=B5=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 315 ++++++--------- docs/.vuepress/navbar.ts | 8 +- docs/.vuepress/public/iconfont/iconfont.css | 10 +- docs/.vuepress/public/iconfont/iconfont.ttf | Bin 16348 -> 16540 bytes docs/.vuepress/public/iconfont/iconfont.woff | Bin 11096 -> 11220 bytes docs/.vuepress/public/iconfont/iconfont.woff2 | Bin 9524 -> 9632 bytes docs/about-the-author/readme.md | 1 + docs/books/readme.md | 4 +- docs/home.md | 381 +++++++++++++++++- docs/readme.md | 42 +- media/pictures/weixin.jpeg | Bin 18036 -> 0 bytes 11 files changed, 527 insertions(+), 234 deletions(-) delete mode 100644 media/pictures/weixin.jpeg diff --git a/README.md b/README.md index 26e60f83..26207403 100755 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ -> [JavaGuide 官方知识星球](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)来啦!!!如果你需要专属面试小册/一对一交流/简历修改/专属求职指南/学习打卡,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc) (一定要确定自己真的需要再加入,一定要看完详细介绍之后再加我)。 +推荐你通过在线阅读网站进行阅读,体验更好,速度更快! + +* **[JavaGuide 在线阅读网站(新版,推荐👍)](https://javaguide.cn/)** +* [JavaGuide 在线阅读版(老版)](https://snailclimb.gitee.io/javaguide/#/)

@@ -27,17 +30,14 @@ > 1. **知识星球** :专属面试小册/一对一交流/简历修改/专属求职指南,欢迎加入 [JavaGuide 知识星球](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)(点击链接即可查看星球的详细介绍,一定一定一定确定自己真的需要再加入,一定一定要看完详细介绍之后再加我)。 > 2. **转载须知** :以下所有文章如非文首说明为转载皆为我(Guide 哥)的原创,转载在文首注明出处,如发现恶意抄袭/搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境! -推荐你通过在线阅读网站进行阅读,体验更好,速度更快! +![JavaGuide 官方公众号](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/gongzhonghaoxuanchuan.png) -* [JavaGuide 在线阅读网站(新版,推荐👍)](https://javaguide.cn/) -* [JavaGuide 在线阅读版(老版)](https://snailclimb.gitee.io/javaguide/#/) - -你可能需要: +## 项目相关 * [项目介绍](./docs/javaguide/intro.md) * [贡献指南](./docs/javaguide/contribution-guideline.md) * [常见问题](./docs/javaguide/faq.md) -* [项目代办.md](./docs/javaguide/todo) +* [项目代办](./docs/javaguide/todo.md) ## Java @@ -45,96 +45,98 @@ **知识点/面试题总结** : (必看:+1: ): -1. [Java 基础常见知识点&面试题总结(上)](docs/java/basis/java-basic-questions-01.md) -2. [Java 基础常见知识点&面试题总结(中)](docs/java/basis/java-basic-questions-02.md) -3. [Java 基础常见知识点&面试题总结(下)](docs/java/basis/java-basic-questions-03.md) +- [Java 基础常见知识点&面试题总结(上)](./docs/java/basis/java-basic-questions-01.md) +- [Java 基础常见知识点&面试题总结(中)](./docs/java/basis/java-basic-questions-02.md) +- [Java 基础常见知识点&面试题总结(下)](./docs/java/basis/java-basic-questions-03.md) **重要知识点详解** : -* [为什么 Java 中只有值传递?](docs/java/basis/why-there-only-value-passing-in-java.md) -* [Java 序列化详解](docs/java/basis/serialization.md) -* [泛型&序列化详解](docs/java/basis/generics-and-wildcards.md) -* [Java 反射机制详解](docs/java/basis/reflection.md) -* [Java 代理模式详解](docs/java/basis/proxy.md) -* [BigDecimal 详解](docs/java/basis/bigdecimal.md) -* [Java 魔法类 Unsafe 详解](docs/java/basis/unsafe.md) -* [Java SPI 机制详解](docs/java/basis/spi.md) +- [为什么 Java 中只有值传递?](./docs/java/basis/why-there-only-value-passing-in-java.md) +- [Java 序列化详解](./docs/java/basis/serialization.md) +- [泛型&序列化详解](./docs/java/basis/generics-and-wildcards.md) +- [Java 反射机制详解](./docs/java/basis/reflection.md) +- [Java 代理模式详解](./docs/java/basis/proxy.md) +- [BigDecimal 详解](./docs/java/basis/bigdecimal.md) +- [Java 魔法类 Unsafe 详解](./docs/java/basis/unsafe.md) +- [Java SPI 机制详解](./docs/java/basis/spi.md) ### 集合 **知识点/面试题总结** : -1. [Java 集合常见知识点&面试题总结(上)](docs/java/collection/java-collection-questions-01.md) (必看 :+1:) -2. [Java 集合常见知识点&面试题总结(下)](docs/java/collection/java-collection-questions-02.md) (必看 :+1:) -3. [Java 容器使用注意事项总结](docs/java/collection/java-collection-precautions-for-use.md) +- [Java 集合常见知识点&面试题总结(上)](./docs/java/collection/java-collection-questions-01.md) (必看 :+1:) +- [Java 集合常见知识点&面试题总结(下)](./docs/java/collection/java-collection-questions-02.md) (必看 :+1:) +- [Java 容器使用注意事项总结](./docs/java/collection/java-collection-precautions-for-use.md) **源码分析** : -* [ArrayList 源码+扩容机制分析](docs/java/collection/arraylist-source-code.md) -* [HashMap(JDK1.8)源码+底层数据结构分析](docs/java/collection/hashmap-source-code.md) -* [ConcurrentHashMap 源码+底层数据结构分析](docs/java/collection/concurrent-hash-map-source-code.md) +* [ArrayList 源码+扩容机制分析](./docs/java/collection/arraylist-source-code.md) +* [HashMap(JDK1.8)源码+底层数据结构分析](./docs/java/collection/hashmap-source-code.md) +* [ConcurrentHashMap 源码+底层数据结构分析](./docs/java/collection/concurrent-hash-map-source-code.md) ### IO -* [IO 基础知识总结](docs/java/io/io-basis.md) -* [IO 设计模式总结](docs/java/io/io-design-patterns.md) -* [IO 模型详解](docs/java/io/io-model.md) +* [IO 基础知识总结](./docs/java/io/io-basis.md) +* [IO 设计模式总结](./docs/java/io/io-design-patterns.md) +* [IO 模型详解](./docs/java/io/io-model.md) ### 并发 **知识点/面试题总结** : (必看 :+1:) -1. [Java 并发常见知识点&面试题总结(上)](docs/java/concurrent/java-concurrent-questions-01.md) -2. [Java 并发常见知识点&面试题总结(中)](docs/java/concurrent/java-concurrent-questions-02.md) -3. [Java 并发常见知识点&面试题总结(下)](docs/java/concurrent/java-concurrent-questions-03.md) +- [Java 并发常见知识点&面试题总结(上)](./docs/java/concurrent/java-concurrent-questions-01.md) +- [Java 并发常见知识点&面试题总结(中)](./docs/java/concurrent/java-concurrent-questions-02.md) +- [Java 并发常见知识点&面试题总结(下)](./docs/java/concurrent/java-concurrent-questions-03.md) **重要知识点详解** : - [JMM(Java 内存模型)详解](./docs/java/concurrent/jmm.md) - **线程池** :[Java 线程池详解](./docs/java/concurrent/java-thread-pool-summary.md)、[Java 线程池最佳实践](./docs/java/concurrent/java-thread-pool-best-practices.md) -- [ThreadLocal 详解](docs/java/concurrent/threadlocal.md) -- [Java 并发容器总结](docs/java/concurrent/java-concurrent-collections.md) -- [Atomic 原子类总结](docs/java/concurrent/atomic-classes.md) -- [AQS 详解](docs/java/concurrent/aqs.md) -- [CompletableFuture入门](docs/java/concurrent/completablefuture-intro.md) +- [ThreadLocal 详解](./docs/java/concurrent/threadlocal.md) +- [Java 并发容器总结](./docs/java/concurrent/java-concurrent-collections.md) +- [Atomic 原子类总结](./docs/java/concurrent/atomic-classes.md) +- [AQS 详解](./docs/java/concurrent/aqs.md) +- [CompletableFuture入门](./docs/java/concurrent/completablefuture-intro.md) ### JVM (必看 :+1:) JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle.com/javase/specs/jvms/se8/html/index.html) 和周志明老师的[《深入理解Java虚拟机(第3版)》](https://book.douban.com/subject/34907497/) (强烈建议阅读多遍!)。 -1. **[Java 内存区域](./docs/java/jvm/memory-area.md)** -2. **[JVM 垃圾回收](./docs/java/jvm/jvm-garbage-collection.md)** -3. [JDK 监控和故障处理工具](./docs/java/jvm/jdk-monitoring-and-troubleshooting-tools.md) -4. [类文件结构](./docs/java/jvm/class-file-structure.md) -5. **[类加载过程](./docs/java/jvm/class-loading-process.md)** -6. [类加载器](./docs/java/jvm/classloader.md) -7. **[【待完成】最重要的 JVM 参数总结(翻译完善了一半)](./docs/java/jvm/jvm-parameters-intro.md)** -8. **[【加餐】大白话带你认识 JVM](./docs/java/jvm/jvm-intro.md)** +- **[Java 内存区域](./docs/java/jvm/memory-area.md)** +- **[JVM 垃圾回收](./docs/java/jvm/jvm-garbage-collection.md)** +- [类文件结构](./docs/java/jvm/class-file-structure.md) +- **[类加载过程](./docs/java/jvm/class-loading-process.md)** +- [类加载器](./docs/java/jvm/classloader.md) +- [【待完成】最重要的 JVM 参数总结(翻译完善了一半)](./docs/java/jvm/jvm-parameters-intro.md) +- [【加餐】大白话带你认识 JVM](./docs/java/jvm/jvm-intro.md)** +- [JDK 监控和故障处理工具](./docs/java/jvm/jdk-monitoring-and-troubleshooting-tools.md) ### 新特性 -1. **Java 8** :[Java 8 新特性总结(翻译)](docs/java/new-features/java8-tutorial-translate.md)、[Java8常用新特性总结](./docs/java/new-features/java8-common-new-features.md) -2. [Java 9 新特性概览](./docs/java/new-features/java9.md) -3. [Java 10 新特性概览](./docs/java/new-features/java10.md) -4. [Java 11 新特性概览](./docs/java/new-features/java11.md) -5. [Java 12~13 新特性概览](./docs/java/new-features/java12-13.md) -6. [Java 14~15 新特性概览](./docs/java/new-features/java14-15.md) -7. [Java 16 新特性概览](./docs/java/new-features/java16.md) +- **Java 8** :[Java 8 新特性总结(翻译)](./docs/java/new-features/java8-tutorial-translate.md)、[Java8常用新特性总结](./docs/java/new-features/java8-common-new-features.md) +- [Java 9 新特性概览](./docs/java/new-features/java9.md) +- [Java 10 新特性概览](./docs/java/new-features/java10.md) +- [Java 11 新特性概览](./docs/java/new-features/java11.md) +- [Java 12~13 新特性概览](./docs/java/new-features/java12-13.md) +- [Java 14~15 新特性概览](./docs/java/new-features/java14-15.md) +- [Java 16 新特性概览](./docs/java/new-features/java16.md) + +![JavaGuide 官方公众号](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/gongzhonghaoxuanchuan.png) ## 计算机基础 ### 操作系统 -1. [操作系统常见问题总结!](docs/cs-basics/operating-system/operating-system-basic-questions-01.md) -2. [后端程序员必备的 Linux 基础知识总结](docs/cs-basics/operating-system/linux-intro.md) -3. [Shell 编程入门](docs/cs-basics/operating-system/shell-intro.md) +- [操作系统常见问题总结!](./docs/cs-basics/operating-system/operating-system-basic-questions-01.md) +- [后端程序员必备的 Linux 基础知识总结](./docs/cs-basics/operating-system/linux-intro.md) +- [Shell 编程基础知识总结](./docs/cs-basics/operating-system/shell-intro.md) ### 网络 **知识点/面试题总结** : - [计算机网络常见知识点&面试题总结](./docs/cs-basics/network/other-network-questions.md) -- [谢希仁老师的《计算机网络》内容总结(补充)](docs/cs-basics/network/谢希仁老师的《计算机网络》内容总结.md) +- [谢希仁老师的《计算机网络》内容总结(补充)](./docs/cs-basics/network/computer-network-xiexiren-summary.md) **重要知识点详解** : @@ -150,14 +152,14 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle **图解数据结构:** -1. [线性数据结构 :数组、链表、栈、队列](docs/cs-basics/data-structure/linear-data-structure.md) -2. [图](docs/cs-basics/data-structure/graph.md) -3. [堆](docs/cs-basics/data-structure/heap.md) -4. [树](docs/cs-basics/data-structure/tree.md) :重点关注[红黑树](docs/cs-basics/data-structure/red-black-tree.md)、B-,B+,B*树、LSM树 +- [线性数据结构 :数组、链表、栈、队列](./docs/cs-basics/data-structure/linear-data-structure.md) +- [图](./docs/cs-basics/data-structure/graph.md) +- [堆](./docs/cs-basics/data-structure/heap.md) +- [树](./docs/cs-basics/data-structure/tree.md) :重点关注[红黑树](./docs/cs-basics/data-structure/red-black-tree.md)、B-,B+,B*树、LSM树 其他常用数据结构 : -1. [布隆过滤器](docs/cs-basics/data-structure/bloom-filter.md) +- [布隆过滤器](./docs/cs-basics/data-structure/bloom-filter.md) ### 算法 @@ -168,10 +170,10 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle **常见算法问题总结** : -* [几道常见的字符串算法题总结 ](docs/cs-basics/algorithms/string-algorithm-problems.md) -* [几道常见的链表算法题总结 ](docs/cs-basics/algorithms/linkedlist-algorithm-problems.md) -* [剑指 offer 部分编程题](docs/cs-basics/algorithms/the-sword-refers-to-offer.md) -* [十大经典排序算法](docs/cs-basics/algorithms/10-classical-sorting-algorithms.md) +* [几道常见的字符串算法题总结 ](./docs/cs-basics/algorithms/string-algorithm-problems.md) +* [几道常见的链表算法题总结 ](./docs/cs-basics/algorithms/linkedlist-algorithm-problems.md) +* [剑指 offer 部分编程题](./docs/cs-basics/algorithms/the-sword-refers-to-offer.md) +* [十大经典排序算法](./docs/cs-basics/algorithms/10-classical-sorting-algorithms.md) 另外,[GeeksforGeeks]( https://www.geeksforgeeks.org/fundamentals-of-algorithms/) 这个网站总结了常见的算法 ,比较全面系统。 @@ -179,37 +181,37 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle ### 基础 -- [数据库基础知识总结](docs/database/basis.md) -- [字符集详解](docs/database/character-set.md) +- [数据库基础知识总结](./docs/database/basis.md) +- [字符集详解](./docs/database/character-set.md) ### MySQL **知识点/面试题总结:** -- **[MySQL知识点总结](docs/database/mysql/mysql-questions-01.md)** (必看 :+1:) -- [一千行 MySQL 学习笔记](docs/database/mysql/a-thousand-lines-of-mysql-study-notes.md) -- [MySQL 高性能优化规范建议](docs/database/mysql/mysql-high-performance-optimization-specification-recommendations.md) +- **[MySQL知识点总结](./docs/database/mysql/mysql-questions-01.md)** (必看 :+1:) +- [一千行 MySQL 学习笔记](./docs/database/mysql/a-thousand-lines-of-mysql-study-notes.md) +- [MySQL 高性能优化规范建议](./docs/database/mysql/mysql-high-performance-optimization-specification-recommendations.md) **重要知识点:** -- [MySQL数据库索引总结](docs/database/mysql/mysql-index.md) -- [事务隔离级别(图文详解)](docs/database/mysql/transaction-isolation-level.md) -- [MySQL三大日志(binlog、redo log和undo log)详解](docs/database/mysql/mysql-logs.md) -- [InnoDB存储引擎对MVCC的实现](docs/database/mysql/innodb-implementation-of-mvcc.md) -- [SQL语句在MySQL中的执行过程](docs/database/mysql/how-sql-executed-in-mysql.md) -- [关于数据库中如何存储时间的一点思考](docs/database/mysql/some-thoughts-on-database-storage-time.md) -- [MySQL中的隐式转换造成的索引失效](docs/database/mysql/index-invalidation-caused-by-implicit-conversion.md) +- [MySQL数据库索引总结](./docs/database/mysql/mysql-index.md) +- [事务隔离级别(图文详解)](./docs/database/mysql/transaction-isolation-level.md) +- [MySQL三大日志(binlog、redo log和undo log)详解](./docs/database/mysql/mysql-logs.md) +- [InnoDB存储引擎对MVCC的实现](./docs/database/mysql/innodb-implementation-of-mvcc.md) +- [SQL语句在MySQL中的执行过程](./docs/database/mysql/how-sql-executed-in-mysql.md) +- [关于数据库中如何存储时间的一点思考](./docs/database/mysql/some-thoughts-on-database-storage-time.md) +- [MySQL中的隐式转换造成的索引失效](./docs/database/mysql/index-invalidation-caused-by-implicit-conversion.md) ### Redis **知识点/面试题总结** : (必看:+1: ): -- [Redis 常见问题总结(上)](docs/database/redis/redis-questions-01.md) -- [Redis 常见问题总结(下)](docs/database/redis/redis-questions-02.md) +- [Redis 常见问题总结(上)](./docs/database/redis/redis-questions-01.md) +- [Redis 常见问题总结(下)](./docs/database/redis/redis-questions-02.md) **重要知识点:** -- [3种常用的缓存读写策略详解](docs/database/redis/3-commonly-used-cache-read-and-write-strategies.md) +- [3种常用的缓存读写策略详解](./docs/database/redis/3-commonly-used-cache-read-and-write-strategies.md) - [Redis 5 种基本数据结构详解](./docs/database/redis/redis-data-structures-01.md) - [Redis 3 种特殊数据结构详解](./docs/database/redis/redis-data-structures-02.md) - [Redis 内存碎片详解](./docs/database/redis/redis-memory-fragmentation.md) @@ -219,6 +221,8 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle 用于提高搜索效率,功能和浏览器搜索引擎类似。比较常见的搜索引擎是 Elasticsearch(推荐) 和 Solr。 +![JavaGuide 官方公众号](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/gongzhonghaoxuanchuan.png) + ## 开发工具 ### Docker @@ -235,42 +239,40 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle ### 基础 -- [RestFul API 简明教程](docs/system-design/basis/RESTfulAPI.md) -- [Java 编码命名之道](docs/system-design/basis/naming.md) +- [RestFul API 简明教程](./docs/system-design/basis/RESTfulAPI.md) +- [Java 编码命名之道](./docs/system-design/basis/naming.md) - [代码重构指南](./docs/system-design/basis/refactoring.md) - [单元测试指南](./docs/system-design/basis/unit-test.md) ### 常用框架 -如果你没有接触过 Java Web 开发的话,可以先看一下我总结的 [《J2EE 基础知识》](docs/system-design/J2EE基础知识.md) 。虽然,这篇文章中的很多内容已经淘汰,但是可以让你对 Java 后台技术发展有更深的认识。 - #### Spring/SpringBoot (必看 :+1:) **知识点/面试题总结** : -- [Spring 常见知识点&面试题总结](docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md) -- [SpringBoot 常见知识点&面试题总结](docs/system-design/framework/spring/springboot-knowledge-and-questions-summary.md) +- [Spring 常见知识点&面试题总结](./docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md) +- [SpringBoot 常见知识点&面试题总结](./docs/system-design/framework/spring/springboot-knowledge-and-questions-summary.md) - [Spring/Spring Boot 常用注解总结](./docs/system-design/framework/spring/spring-common-annotations.md) - [SpringBoot 入门指南](https://github.com/Snailclimb/springboot-guide) **重要知识点详解** : -- [Spring 事务详解](docs/system-design/framework/spring/spring-transaction.md) -- [Spring 中的设计模式详解](docs/system-design/framework/spring/spring-design-patterns-summary.md) -- [SpringBoot 自动装配原理详解](docs/system-design/framework/spring/spring-boot-auto-assembly-principles.md) +- [Spring 事务详解](./docs/system-design/framework/spring/spring-transaction.md) +- [Spring 中的设计模式详解](./docs/system-design/framework/spring/spring-design-patterns-summary.md) +- [SpringBoot 自动装配原理详解](./docs/system-design/framework/spring/spring-boot-auto-assembly-principles.md) #### MyBatis -[MyBatis 常见面试题总结](docs/system-design/framework/mybatis/mybatis-interview.md) +[MyBatis 常见面试题总结](./docs/system-design/framework/mybatis/mybatis-interview.md) ### 安全 #### 认证授权 -- [认证授权基础](docs/system-design/security/basis-of-authority-certification.md) -- [JWT 基本概念详解](docs/system-design/security/jwt-intro.md) -- [JWT 优缺点分析以及常见问题解决方案](docs/system-design/security/advantages&disadvantages-of-jwt.md) -- [SSO 单点登录详解](docs/system-design/security/sso-intro.md) +- [认证授权基础](./docs/system-design/security/basis-of-authority-certification.md) +- [JWT 基本概念详解](./docs/system-design/security/jwt-intro.md) +- [JWT 优缺点分析以及常见问题解决方案](./docs/system-design/security/advantages&disadvantages-of-jwt.md) +- [SSO 单点登录详解](./docs/system-design/security/sso-intro.md) #### 数据脱敏 @@ -278,143 +280,89 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle #### 敏感词过滤 -系统需要对用户输入的文本进行敏感词过滤如色情、政治、暴力相关的词汇。 - -相关阅读:[《敏感词过滤》](./docs/system-design/security/sentive-words-filter.md) +[《敏感词过滤》](./docs/system-design/security/sentive-words-filter.md) ### 定时任务 -最近有朋友问到定时任务相关的问题。于是,我简单写了一篇文章总结一下定时任务的一些概念以及一些常见的定时任务技术选型:[《Java定时任务大揭秘》](./docs/system-design/schedule-task.md) +[《Java定时任务大揭秘》](./docs/system-design/schedule-task.md) ## 分布式 ### CAP 理论和 BASE 理论 -CAP 也就是 Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容错性) 这三个单词首字母组合。 - -**BASE** 是 **Basically Available(基本可用)** 、**Soft-state(软状态)** 和 **Eventually Consistent(最终一致性)** 三个短语的缩写。BASE 理论是对 CAP 中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的总结,是基于 CAP 定理逐步演化而来的,它大大降低了我们对系统的要求。 - -相关阅读:[CAP 理论和 BASE 理论解读](docs/distributed-system/theorem&algorithm&protocol/cap&base-theorem.md) +[CAP 理论和 BASE 理论解读](./docs/distributed-system/theorem&algorithm&protocol/cap&base-theorem.md) ### Paxos 算法和 Raft 算法 -**Paxos 算法** 诞生于 1990 年,这是一种解决分布式系统一致性的经典算法 。但是,由于 Paxos 算法非常难以理解和实现,不断有人尝试简化这一算法。到了2013 年才诞生了一个比 Paxos 算法更易理解和实现的分布式一致性算法—**Raft 算法**。 - -相关阅读: - -* [Paxos 算法解读](docs/distributed-system/theorem&algorithm&protocol/paxos-algorithm.md) -* [Raft 算法解读](docs/distributed-system/theorem&algorithm&protocol/raft-algorithm.md) +- [Paxos 算法解读](./docs/distributed-system/theorem&algorithm&protocol/paxos-algorithm.md) +- [Raft 算法解读](./docs/distributed-system/theorem&algorithm&protocol/raft-algorithm.md) ### RPC -RPC 让调用远程服务调用像调用本地方法那样简单。 - -Dubbo 是一款国产的 RPC 框架,由阿里开源。相关阅读: - -* [RPC 基础常见知识点&面试题总结](docs/distributed-system/rpc/rpc-intro.md) -* [Dubbo 常见知识点&面试题总结](docs/distributed-system/rpc/dubbo.md) +* [RPC 基础常见知识点&面试题总结](./docs/distributed-system/rpc/rpc-intro.md) +* [Dubbo 常见知识点&面试题总结](./docs/distributed-system/rpc/dubbo.md) ### API 网关 -网关主要用于请求转发、安全认证、协议转换、容灾。 - -相关阅读: - -* [为什么要网关?你知道有哪些常见的网关系统?](docs/distributed-system/api-gateway.md) +* [为什么要网关?你知道有哪些常见的网关系统?](./docs/distributed-system/api-gateway.md) * [百亿规模API网关服务Shepherd的设计与实现](https://tech.meituan.com/2021/05/20/shepherd-api-gateway.html) ### 分布式 id -在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。比如数据量太大之后,往往需要对数据进行分库分表,分库分表后需要有一个唯一 ID 来标识一条数据或消息,数据库的自增 ID 显然不能满足需求。相关阅读:[为什么要分布式 id ?分布式 id 生成方案有哪些?](docs/distributed-system/distributed-id.md) +[为什么要分布式 id ?分布式 id 生成方案有哪些?](./docs/distributed-system/distributed-id.md) ### 分布式事务 -**分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。** - -简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。 +[分布式事务](./docs/distributed-system/distributed-transaction.md) ### 分布式协调 -**ZooKeeper** : - > 前两篇文章可能有内容重合部分,推荐都看一遍。 -1. [【入门】ZooKeeper 相关概念总结](docs/distributed-system/distributed-process-coordination/zookeeper/zookeeper-intro.md) -2. [【进阶】ZooKeeper 相关概念总结](docs/distributed-system/distributed-process-coordination/zookeeper/zookeeper-plus.md) -3. [【实战】ZooKeeper 实战](docs/distributed-system/distributed-process-coordination/zookeeper/zookeeper-in-action.md) +- [ZooKeeper 相关概念总结(入门)](./docs/distributed-system/distributed-process-coordination/zookeeper/zookeeper-intro.md) +- [ZooKeeper 相关概念总结(进阶)](./docs/distributed-system/distributed-process-coordination/zookeeper/zookeeper-plus.md) +- [ZooKeeper 实战](./docs/distributed-system/distributed-process-coordination/zookeeper/zookeeper-in-action.md) + +![JavaGuide 官方公众号](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/gongzhonghaoxuanchuan.png) ## 高性能 ### 消息队列 -消息队列在分布式系统中主要是为了解耦和削峰。相关阅读: [消息队列常见问题总结](docs/high-performance/message-queue/message-queue.md)。 +消息队列在分布式系统中主要是为了解耦和削峰。相关阅读: [消息队列常见问题总结](./docs/high-performance/message-queue/message-queue.md)。 -1. **RabbitMQ** : [RabbitMQ 基础知识总结](docs/high-performance/message-queue/rabbitmq-intro.md)、[RabbitMQ 常见面试题](docs/high-performance/message-queue/rabbitmq-questions.md) -2. **RocketMQ** : [RocketMQ 基础知识总结](docs/high-performance/message-queue/rocketmq-intro.md)、[RocketMQ 常见面试题总结](docs/high-performance/message-queue/rocketmq-questions.md) -3. **Kafka** :[Kafka 常见问题总结](docs/high-performance/message-queue/kafka-questions-01.md) +- **RabbitMQ** : [RabbitMQ 基础知识总结](./docs/high-performance/message-queue/rabbitmq-intro.md)、[RabbitMQ 常见面试题](./docs/high-performance/message-queue/rabbitmq-questions.md) +- **RocketMQ** : [RocketMQ 基础知识总结](./docs/high-performance/message-queue/rocketmq-intro.md)、[RocketMQ 常见面试题总结](./docs/high-performance/message-queue/rocketmq-questions.md) +- **Kafka** :[Kafka 常见问题总结](./docs/high-performance/message-queue/kafka-questions-01.md) ### 读写分离&分库分表 -读写分离主要是为了将数据库的读和写操作分不到不同的数据库节点上。主服务器负责写,从服务器负责读。另外,一主一从或者一主多从都可以。 - -读写分离可以大幅提高读性能,小幅提高写的性能。因此,读写分离更适合单机并发读请求比较多的场景。 - -分库分表是为了解决由于库、表数据量过大,而导致数据库性能持续下降的问题。 - -常见的分库分表工具有: `sharding-jdbc` (当当)、 `TSharding` (蘑菇街)、 `MyCAT` (基于 Cobar)、 `Cobar` (阿里巴巴)...。 推荐使用 `sharding-jdbc` 。 因为, `sharding-jdbc` 是一款轻量级 `Java` 框架,以 `jar` 包形式提供服务,不要我们做额外的运维工作,并且兼容性也很好。 - -相关阅读: [读写分离&分库分表常见问题总结](docs/high-performance/read-and-write-separation-and-library-subtable.md) + [读写分离&分库分表](./docs/high-performance/read-and-write-separation-and-library-subtable.md) ### 负载均衡 -负载均衡系统通常用于将任务比如用户请求处理分配到多个服务器处理以提高网站、应用或者数据库的性能和可靠性。 - -常见的负载均衡系统包括 3 种: - -1. **DNS 负载均衡** :一般用来实现地理级别的均衡。 -2. **硬件负载均衡** : 通过单独的硬件设备比如 F5 来实现负载均衡功能(硬件的价格一般很贵)。 -3. **软件负载均衡** :通过负载均衡软件比如 Nginx 来实现负载均衡功能。 + [负载均衡](./docs/high-performance/load-balancing.md) ## 高可用 -高可用描述的是一个系统在大部分时间都是可用的,可以为我们提供服务的。高可用代表系统即使在发生硬件故障或者系统升级的时候,服务仍然是可用的 。 - -相关阅读: **《[如何设计一个高可用系统?要考虑哪些地方?](docs/high-availability/high-availability-system-design.md)》** 。 +[高可用系统设计指南](./docs/high-availability/high-availability-system-design.md) 。 ### 限流 -限流是从用户访问压力的角度来考虑如何应对系统故障。 +[何为限流?限流算法有哪些?](./docs/high-availability/limit-request.md) -限流为了对服务端的接口接受请求的频率进行限制,防止服务挂掉。比如某一接口的请求限制为 100 个每秒, 对超过限制的请求放弃处理或者放到队列中等待处理。限流可以有效应对突发请求过多。相关阅读:[何为限流?限流算法有哪些?](docs/high-availability/limit-request.md) +### 降级&熔断 -### 降级 +[降级&熔断](./docs/high-availability/fallback&circuit-breaker.md) -降级是从系统功能优先级的角度考虑如何应对系统故障。 +### 超时&重试 -服务降级指的是当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。 - -### 熔断 - -熔断和降级是两个比较容易混淆的概念,两者的含义并不相同。 - -降级的目的在于应对系统自身的故障,而熔断的目的在于应对当前系统依赖的外部系统或者第三方系统的故障。 - -### 排队 - -另类的一种限流,类比于现实世界的排队。玩过英雄联盟的小伙伴应该有体会,每次一有活动,就要经历一波排队才能进入游戏。 +[超时&重试](./docs/high-availability/timeout-and-retry.md) ### 集群 相同的服务部署多份,避免单点故障。 -### 超时和重试机制 - -**一旦用户的请求超过某个时间得不到响应就结束此次请求并抛出异常。** 如果不进行超时设置可能会导致请求响应速度慢,甚至导致请求堆积进而让系统无法再处理请求。 - -重试的次数一般设为 3 次,再多的重试次数没有好处,反而会加重服务器压力(部分场景使用失败重试机制会不太适合)。在一次重试失败之后通常会加上一个时间间隔 delay 再进行下一次重试,时间间隔 delay 通常建议是随机的。 - -并且,为了更好地保护下游,我们还可以结合断路器。 - ### 灾备设计和异地多活 **灾备** = 容灾+备份。 @@ -424,20 +372,6 @@ Dubbo 是一款国产的 RPC 框架,由阿里开源。相关阅读: **异地多活** 描述的是将服务部署在异地并且服务同时对外提供服务。和传统的灾备设计的最主要区别在于“多活”,即所有站点都是同时在对外提供服务的。异地多活是为了应对突发状况比如火灾、地震等自然或者人为灾害。 -相关阅读: - -* [搞懂异地多活,看这篇就够了](https://mp.weixin.qq.com/s/T6mMDdtTfBuIiEowCpqu6Q) -* [四步构建异地多活](https://mp.weixin.qq.com/s/hMD-IS__4JE5_nQhYPYSTg) -* [《从零开始学架构》— 28 | 业务高可用的保障:异地多活架构](http://gk.link/a/10pKZ) - -## 关于作者 - -* [个人介绍 Q&A](https://javaguide.cn/about-the-author/) -* [我曾经也是网瘾少年](https://javaguide.cn/about-the-author/internet-addiction-teenager/) -* [入职培训一个月后的感受](https://javaguide.cn/about-the-author/feelings-after-one-month-of-induction-training/) -* [从毕业到入职半年的感受](https://javaguide.cn/about-the-author/feelings-of-half-a-year-from-graduation-to-entry/) -* [某培训机构盗我文章做成视频还上了B站热门](https://javaguide.cn/about-the-author/my-article-was-stolen-and-made-into-video-and-it-became-popular/) - ## Star 趋势 ![](https://api.star-history.com/svg?repos=Snailclimb/JavaGuide&type=Date) @@ -446,10 +380,5 @@ Dubbo 是一款国产的 RPC 框架,由阿里开源。相关阅读: 如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号。 -**《Java面试突击》:** 由本文档衍生的专为面试而生的《Java面试突击》PDF 版本[公众号](#公众号)后台回复 **"面试突击"** 即可免费领取! +![JavaGuide 官方公众号](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/gongzhonghaoxuanchuan.png) -![我的公众号](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/167598cd2e17b8ec.png) - -![](https://img-blog.csdnimg.cn/7af97d4dccdb4123a541f336a107ca86.png) - -![](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3a2d826918a44bcbaa8d9272db3ad7d2~tplv-k3u1fbpfcp-watermark.image) diff --git a/docs/.vuepress/navbar.ts b/docs/.vuepress/navbar.ts index ec7a6157..068965af 100644 --- a/docs/.vuepress/navbar.ts +++ b/docs/.vuepress/navbar.ts @@ -10,11 +10,11 @@ export const navbarConfig = defineNavbarConfig([ text: "网站相关", icon: "about", children: [ - { text: "走近作者", icon: "zuozhe", link: "/about-the-author/" }, + { text: "关于作者", icon: "zuozhe", link: "/about-the-author/" }, { - text: "网站历史", - icon: "java", - link: "/javaguide/history.md", + text: "更新历史", + icon: "history", + link: "/timeline/", }, { text: "旧版入口", diff --git a/docs/.vuepress/public/iconfont/iconfont.css b/docs/.vuepress/public/iconfont/iconfont.css index 6548206e..72425971 100644 --- a/docs/.vuepress/public/iconfont/iconfont.css +++ b/docs/.vuepress/public/iconfont/iconfont.css @@ -1,8 +1,8 @@ @font-face { font-family: "iconfont"; /* Project id 2922463 */ - src: url('iconfont.woff2?t=1655098798936') format('woff2'), - url('iconfont.woff?t=1655098798936') format('woff'), - url('iconfont.ttf?t=1655098798936') format('truetype'); + src: url('iconfont.woff2?t=1660530571134') format('woff2'), + url('iconfont.woff?t=1660530571134') format('woff'), + url('iconfont.ttf?t=1660530571134') format('truetype'); } .iconfont { @@ -13,6 +13,10 @@ -moz-osx-font-smoothing: grayscale; } +.icon-history:before { + content: "\e752"; +} + .icon-experience:before { content: "\e72b"; } diff --git a/docs/.vuepress/public/iconfont/iconfont.ttf b/docs/.vuepress/public/iconfont/iconfont.ttf index 1736b26f16ff4d69b2d8a3ecd672da3ad7648053..c7db671227380f610b4af2d7544c6a1ce21e28fd 100644 GIT binary patch delta 1432 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 N#WWcF0ftGobpW;&phf@y diff --git a/docs/.vuepress/public/iconfont/iconfont.woff2 b/docs/.vuepress/public/iconfont/iconfont.woff2 index fc812bfb39c442ac665fe07335a70533e820365a..f5c8a1a74e7ea6cce19e8e98eb77af793c73766f 100644 GIT binary patch literal 9632 zcmV;RC12WiPew8T0RR91041OR3jhEB06?4o03}ZV0RR9100000000000000000000 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 S%0eerc>+%3Y!Ee6A>09HXK)?> diff --git a/docs/about-the-author/readme.md b/docs/about-the-author/readme.md index 123bd455..5022d46d 100644 --- a/docs/about-the-author/readme.md +++ b/docs/about-the-author/readme.md @@ -61,3 +61,4 @@ category: 走近作者 生活本就是有苦有甜。共勉! +![JavaGuide 官方公众号](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/gongzhonghaoxuanchuan.png) diff --git a/docs/books/readme.md b/docs/books/readme.md index a3415a9e..3f0060de 100644 --- a/docs/books/readme.md +++ b/docs/books/readme.md @@ -3,7 +3,7 @@ title: 技术书籍精选 category: 计算机书籍 --- -精选优质计算机书籍,希望能够帮助到你。 +精选优质计算机书籍。 开源的目的是为了大家能一起完善,如果你觉得内容有任何需要完善/补充的地方,欢迎大家在项目 [issues 区](https://github.com/CodingDocs/awesome-cs/issues) 推荐自己认可的技术书籍,让我们共同维护一个优质的技术书籍精选集! @@ -12,7 +12,7 @@ category: 计算机书籍 如果内容对你有帮助的话,欢迎给本项目点个 Star。我会用我的业余时间持续完善这份书单,感谢! -另外,本项目推荐的大部分书籍的 PDF 版本我已经整理到了云盘里,你可以在公众号“**Github掘金计划**” 后台回复“**书籍**”获取到。 +本项目推荐的大部分书籍的 PDF 版本我已经整理到了云盘里,你可以在公众号“**Github掘金计划**” 后台回复“**书籍**”获取到。 ![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/booksimage-20220409153638398.png) diff --git a/docs/home.md b/docs/home.md index 9b7c2b20..2f15cfb6 100644 --- a/docs/home.md +++ b/docs/home.md @@ -3,49 +3,390 @@ icon: creative title: JavaGuide(Java学习&&面试指南) --- -

+

+ + + +

+

+ 阅读 + stars + forks + issues +

+

+ Github | + Gitee +

+

-> 1. **面试专版** :准备面试的小伙伴可以考虑面试专版:[《Java 面试指北 》](./zhuanlan/java-mian-shi-zhi-bei.md) (质量很高,专为面试打造,配合 JavaGuide 食用) +> 1. **面试专版** :准备面试的小伙伴可以考虑面试专版:[《Java 面试进阶指北 》](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7) (质量很高,专为面试打造,配合 JavaGuide 食用)。 +> 1. **知识星球** :专属面试小册/一对一交流/简历修改/专属求职指南,欢迎加入 [JavaGuide 知识星球](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)(点击链接即可查看星球的详细介绍,一定一定一定确定自己真的需要再加入,一定一定要看完详细介绍之后再加我)。 > 2. **转载须知** :以下所有文章如非文首说明为转载皆为我(Guide 哥)的原创,转载在文首注明出处,如发现恶意抄袭/搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境! -## 必看专栏 - -- **[《Java 面试指北》](./zhuanlan/java-mian-shi-zhi-bei.md)** : 与 JavaGuide 开源版的内容互补! -- **[《手写 RPC 框架》](./zhuanlan/handwritten-rpc-framework.md)** : 从零开始基于 Netty+Kyro+Zookeeper 实现一个简易的 RPC 框架。 -- **[《Java 必读源码系列》](./zhuanlan/source-code-reading.md)** :目前已经整理了 Dubbo 2.6.x 、Netty 4.x、SpringBoot 2.1 等框架/中间件的源码 +
+

+ + + +

+
## 项目相关 -- [项目介绍](./javaguide/intro.md) -- [贡献指南](./javaguide/contribution-guideline.md) -- [常见问题](./javaguide/faq.md) -- [项目代办](./javaguide/todo.md) +* [项目介绍](./javaguide/intro.md) +* [贡献指南](./javaguide/contribution-guideline.md) +* [常见问题](./javaguide/faq.md) +* [项目代办](./javaguide/todo.md) -## 面试资源 +## Java - +### 基础 + +**知识点/面试题总结** : (必看:+1: ): + +- [Java 基础常见知识点&面试题总结(上)](./java/basis/java-basic-questions-01.md) +- [Java 基础常见知识点&面试题总结(中)](./java/basis/java-basic-questions-02.md) +- [Java 基础常见知识点&面试题总结(下)](./java/basis/java-basic-questions-03.md) + +**重要知识点详解** : + +- [为什么 Java 中只有值传递?](./java/basis/why-there-only-value-passing-in-java.md) +- [Java 序列化详解](./java/basis/serialization.md) +- [泛型&序列化详解](./java/basis/generics-and-wildcards.md) +- [Java 反射机制详解](./java/basis/reflection.md) +- [Java 代理模式详解](./java/basis/proxy.md) +- [BigDecimal 详解](./java/basis/bigdecimal.md) +- [Java 魔法类 Unsafe 详解](./java/basis/unsafe.md) +- [Java SPI 机制详解](./java/basis/spi.md) + +### 集合 + +**知识点/面试题总结** : + +- [Java 集合常见知识点&面试题总结(上)](./java/collection/java-collection-questions-01.md) (必看 :+1:) +- [Java 集合常见知识点&面试题总结(下)](./java/collection/java-collection-questions-02.md) (必看 :+1:) +- [Java 容器使用注意事项总结](./java/collection/java-collection-precautions-for-use.md) + +**源码分析** : + +* [ArrayList 源码+扩容机制分析](./java/collection/arraylist-source-code.md) +* [HashMap(JDK1.8)源码+底层数据结构分析](./java/collection/hashmap-source-code.md) +* [ConcurrentHashMap 源码+底层数据结构分析](./java/collection/concurrent-hash-map-source-code.md) + +### IO + +* [IO 基础知识总结](./java/io/io-basis.md) +* [IO 设计模式总结](./java/io/io-design-patterns.md) +* [IO 模型详解](./java/io/io-model.md) + +### 并发 + +**知识点/面试题总结** : (必看 :+1:) + +- [Java 并发常见知识点&面试题总结(上)](./java/concurrent/java-concurrent-questions-01.md) +- [Java 并发常见知识点&面试题总结(中)](./java/concurrent/java-concurrent-questions-02.md) +- [Java 并发常见知识点&面试题总结(下)](./java/concurrent/java-concurrent-questions-03.md) + +**重要知识点详解** : + +- [JMM(Java 内存模型)详解](./java/concurrent/jmm.md) +- **线程池** :[Java 线程池详解](./java/concurrent/java-thread-pool-summary.md)、[Java 线程池最佳实践](./java/concurrent/java-thread-pool-best-practices.md) +- [ThreadLocal 详解](./java/concurrent/threadlocal.md) +- [Java 并发容器总结](./java/concurrent/java-concurrent-collections.md) +- [Atomic 原子类总结](./java/concurrent/atomic-classes.md) +- [AQS 详解](./java/concurrent/aqs.md) +- [CompletableFuture入门](./java/concurrent/completablefuture-intro.md) + +### JVM (必看 :+1:) + +JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle.com/javase/specs/jvms/se8/html/index.html) 和周志明老师的[《深入理解Java虚拟机(第3版)》](https://book.douban.com/subject/34907497/) (强烈建议阅读多遍!)。 + +- **[Java 内存区域](./java/jvm/memory-area.md)** +- **[JVM 垃圾回收](./java/jvm/jvm-garbage-collection.md)** +- [类文件结构](./java/jvm/class-file-structure.md) +- **[类加载过程](./java/jvm/class-loading-process.md)** +- [类加载器](./java/jvm/classloader.md) +- [【待完成】最重要的 JVM 参数总结(翻译完善了一半)](./java/jvm/jvm-parameters-intro.md) +- [【加餐】大白话带你认识 JVM](./java/jvm/jvm-intro.md)** +- [JDK 监控和故障处理工具](./java/jvm/jdk-monitoring-and-troubleshooting-tools.md) + +### 新特性 + +- **Java 8** :[Java 8 新特性总结(翻译)](./java/new-features/java8-tutorial-translate.md)、[Java8常用新特性总结](./java/new-features/java8-common-new-features.md) +- [Java 9 新特性概览](./java/new-features/java9.md) +- [Java 10 新特性概览](./java/new-features/java10.md) +- [Java 11 新特性概览](./java/new-features/java11.md) +- [Java 12~13 新特性概览](./java/new-features/java12-13.md) +- [Java 14~15 新特性概览](./java/new-features/java14-15.md) +- [Java 16 新特性概览](./java/new-features/java16.md) + +![JavaGuide 官方公众号](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/gongzhonghaoxuanchuan.png) + +## 计算机基础 + +### 操作系统 + +- [操作系统常见问题总结!](./cs-basics/operating-system/operating-system-basic-questions-01.md) +- [后端程序员必备的 Linux 基础知识总结](./cs-basics/operating-system/linux-intro.md) +- [Shell 编程基础知识总结](./cs-basics/operating-system/shell-intro.md) + +### 网络 + +**知识点/面试题总结** : + +- [计算机网络常见知识点&面试题总结](./cs-basics/network/other-network-questions.md) +- [谢希仁老师的《计算机网络》内容总结(补充)](./cs-basics/network/computer-network-xiexiren-summary.md) + +**重要知识点详解** : + +- [OSI 和 TCP/IP 网络分层模型详解(基础)](./cs-basics/network/osi&tcp-ip-model.md) +- [应用层常见协议总结(应用层)](./cs-basics/network/application-layer-protocol.md) +- [HTTP vs HTTPS(应用层)](./cs-basics/network/http&https.md) +- [HTTP 1.0 vs HTTP 1.1(应用层)](./cs-basics/network/http1.0&http1.1.md) +- [HTTP 常见状态码(应用层)](./cs-basics/network/http-status-codes.md) +- [TCP 三次握手和四次挥手(传输层)](./cs-basics/network/tcp-connection-and-disconnection.md) +- [TCP 传输可靠性保障(传输层)](./cs-basics/network/tcp-reliability-guarantee.md) + +### 数据结构 + +**图解数据结构:** + +- [线性数据结构 :数组、链表、栈、队列](./cs-basics/data-structure/linear-data-structure.md) +- [图](./cs-basics/data-structure/graph.md) +- [堆](./cs-basics/data-structure/heap.md) +- [树](./cs-basics/data-structure/tree.md) :重点关注[红黑树](./cs-basics/data-structure/red-black-tree.md)、B-,B+,B*树、LSM树 + +其他常用数据结构 : + +- [布隆过滤器](./cs-basics/data-structure/bloom-filter.md) + +### 算法 + +算法这部分内容非常重要,如果你不知道如何学习算法的话,可以看下我写的: + +* [算法学习书籍+资源推荐](https://www.zhihu.com/question/323359308/answer/1545320858) 。 +* [如何刷Leetcode?](https://www.zhihu.com/question/31092580/answer/1534887374) + +**常见算法问题总结** : + +* [几道常见的字符串算法题总结 ](./cs-basics/algorithms/string-algorithm-problems.md) +* [几道常见的链表算法题总结 ](./cs-basics/algorithms/linkedlist-algorithm-problems.md) +* [剑指 offer 部分编程题](./cs-basics/algorithms/the-sword-refers-to-offer.md) +* [十大经典排序算法](./cs-basics/algorithms/10-classical-sorting-algorithms.md) + +另外,[GeeksforGeeks]( https://www.geeksforgeeks.org/fundamentals-of-algorithms/) 这个网站总结了常见的算法 ,比较全面系统。 + +## 数据库 + +### 基础 + +- [数据库基础知识总结](./database/basis.md) +- [字符集详解](./database/character-set.md) + +### MySQL + +**知识点/面试题总结:** + +- **[MySQL知识点总结](./database/mysql/mysql-questions-01.md)** (必看 :+1:) +- [一千行 MySQL 学习笔记](./database/mysql/a-thousand-lines-of-mysql-study-notes.md) +- [MySQL 高性能优化规范建议](./database/mysql/mysql-high-performance-optimization-specification-recommendations.md) + +**重要知识点:** + +- [MySQL数据库索引总结](./database/mysql/mysql-index.md) +- [事务隔离级别(图文详解)](./database/mysql/transaction-isolation-level.md) +- [MySQL三大日志(binlog、redo log和undo log)详解](./database/mysql/mysql-logs.md) +- [InnoDB存储引擎对MVCC的实现](./database/mysql/innodb-implementation-of-mvcc.md) +- [SQL语句在MySQL中的执行过程](./database/mysql/how-sql-executed-in-mysql.md) +- [关于数据库中如何存储时间的一点思考](./database/mysql/some-thoughts-on-database-storage-time.md) +- [MySQL中的隐式转换造成的索引失效](./database/mysql/index-invalidation-caused-by-implicit-conversion.md) + +### Redis + +**知识点/面试题总结** : (必看:+1: ): + +- [Redis 常见问题总结(上)](./database/redis/redis-questions-01.md) +- [Redis 常见问题总结(下)](./database/redis/redis-questions-02.md) + +**重要知识点:** + +- [3种常用的缓存读写策略详解](./database/redis/3-commonly-used-cache-read-and-write-strategies.md) +- [Redis 5 种基本数据结构详解](./database/redis/redis-data-structures-01.md) +- [Redis 3 种特殊数据结构详解](./database/redis/redis-data-structures-02.md) +- [Redis 内存碎片详解](./database/redis/redis-memory-fragmentation.md) +- [Redis 集群详解](./database/redis/redis-cluster.md) + +## 搜索引擎 + +用于提高搜索效率,功能和浏览器搜索引擎类似。比较常见的搜索引擎是 Elasticsearch(推荐) 和 Solr。 + +![JavaGuide 官方公众号](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/gongzhonghaoxuanchuan.png) + +## 开发工具 + +### Docker + +* [Docker 基本概念解读](./tools/docker/docker-intro.md) +* [Docker从入门到上手干事](./tools/docker/docker-in-action.md) + +### Git + +* [Git 入门](./tools/git/git-intro.md) +* [Github 小技巧](./tools/git/github-tips.md) + +## 系统设计 + +### 基础 + +- [RestFul API 简明教程](./system-design/basis/RESTfulAPI.md) +- [Java 编码命名之道](./system-design/basis/naming.md) +- [代码重构指南](./system-design/basis/refactoring.md) +- [单元测试指南](./system-design/basis/unit-test.md) + +### 常用框架 + +#### Spring/SpringBoot (必看 :+1:) + +**知识点/面试题总结** : + +- [Spring 常见知识点&面试题总结](./system-design/framework/spring/spring-knowledge-and-questions-summary.md) +- [SpringBoot 常见知识点&面试题总结](./system-design/framework/spring/springboot-knowledge-and-questions-summary.md) +- [Spring/Spring Boot 常用注解总结](./system-design/framework/spring/spring-common-annotations.md) +- [SpringBoot 入门指南](https://github.com/Snailclimb/springboot-guide) + +**重要知识点详解** : + +- [Spring 事务详解](./system-design/framework/spring/spring-transaction.md) +- [Spring 中的设计模式详解](./system-design/framework/spring/spring-design-patterns-summary.md) +- [SpringBoot 自动装配原理详解](./system-design/framework/spring/spring-boot-auto-assembly-principles.md) + +#### MyBatis + +[MyBatis 常见面试题总结](./system-design/framework/mybatis/mybatis-interview.md) + +### 安全 + +#### 认证授权 + +- [认证授权基础](./system-design/security/basis-of-authority-certification.md) +- [JWT 基本概念详解](./system-design/security/jwt-intro.md) +- [JWT 优缺点分析以及常见问题解决方案](./system-design/security/advantages&disadvantages-of-jwt.md) +- [SSO 单点登录详解](./system-design/security/sso-intro.md) + +#### 数据脱敏 + +数据脱敏说的就是我们根据特定的规则对敏感信息数据进行变形,比如我们把手机号、身份证号某些位数使用 * 来代替。 + +#### 敏感词过滤 + +[《敏感词过滤》](./system-design/security/sentive-words-filter.md) + +### 定时任务 + +[《Java定时任务大揭秘》](./system-design/schedule-task.md) + +## 分布式 + +### CAP 理论和 BASE 理论 + +[CAP 理论和 BASE 理论解读](./distributed-system/theorem&algorithm&protocol/cap&base-theorem.md) + +### Paxos 算法和 Raft 算法 + +- [Paxos 算法解读](./distributed-system/theorem&algorithm&protocol/paxos-algorithm.md) +- [Raft 算法解读](./distributed-system/theorem&algorithm&protocol/raft-algorithm.md) + +### RPC + +* [RPC 基础常见知识点&面试题总结](./distributed-system/rpc/rpc-intro.md) +* [Dubbo 常见知识点&面试题总结](./distributed-system/rpc/dubbo.md) + +### API 网关 + +* [为什么要网关?你知道有哪些常见的网关系统?](./distributed-system/api-gateway.md) +* [百亿规模API网关服务Shepherd的设计与实现](https://tech.meituan.com/2021/05/20/shepherd-api-gateway.html) + +### 分布式 id + +[为什么要分布式 id ?分布式 id 生成方案有哪些?](./distributed-system/distributed-id.md) + +### 分布式事务 + +[分布式事务](./distributed-system/distributed-transaction.md) + +### 分布式协调 + +> 前两篇文章可能有内容重合部分,推荐都看一遍。 + +- [ZooKeeper 相关概念总结(入门)](./distributed-system/distributed-process-coordination/zookeeper/zookeeper-intro.md) +- [ZooKeeper 相关概念总结(进阶)](./distributed-system/distributed-process-coordination/zookeeper/zookeeper-plus.md) +- [ZooKeeper 实战](./distributed-system/distributed-process-coordination/zookeeper/zookeeper-in-action.md) + +![JavaGuide 官方公众号](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/gongzhonghaoxuanchuan.png) + +## 高性能 + +### 消息队列 + +消息队列在分布式系统中主要是为了解耦和削峰。相关阅读: [消息队列常见问题总结](./high-performance/message-queue/message-queue.md)。 + +- **RabbitMQ** : [RabbitMQ 基础知识总结](./high-performance/message-queue/rabbitmq-intro.md)、[RabbitMQ 常见面试题](./high-performance/message-queue/rabbitmq-questions.md) +- **RocketMQ** : [RocketMQ 基础知识总结](./high-performance/message-queue/rocketmq-intro.md)、[RocketMQ 常见面试题总结](./high-performance/message-queue/rocketmq-questions.md) +- **Kafka** :[Kafka 常见问题总结](./high-performance/message-queue/kafka-questions-01.md) + +### 读写分离&分库分表 + + [读写分离&分库分表](./high-performance/read-and-write-separation-and-library-subtable.md) + +### 负载均衡 + + [负载均衡](./high-performance/load-balancing.md) + +## 高可用 + +[高可用系统设计指南](./high-availability/high-availability-system-design.md) 。 + +### 限流 + +[何为限流?限流算法有哪些?](./high-availability/limit-request.md) + +### 降级&熔断 + +[降级&熔断](./high-availability/fallback&circuit-breaker.md) + +### 超时&重试 + +[超时&重试](./high-availability/timeout-and-retry.md) + +### 集群 + +相同的服务部署多份,避免单点故障。 + +### 灾备设计和异地多活 + +**灾备** = 容灾+备份。 + +* **备份** : 将系统所产生的的所有重要数据多备份几份。 +* **容灾** : 在异地建立两个完全相同的系统。当某个地方的系统突然挂掉,整个应用系统可以切换到另一个,这样系统就可以正常提供服务了。 + +**异地多活** 描述的是将服务部署在异地并且服务同时对外提供服务。和传统的灾备设计的最主要区别在于“多活”,即所有站点都是同时在对外提供服务的。异地多活是为了应对突发状况比如火灾、地震等自然或者人为灾害。 ## Star 趋势 ![](https://api.star-history.com/svg?repos=Snailclimb/JavaGuide&type=Date) -## 联系我 -想要参与项目维护或者学习交流的话,欢迎添加我的微信:“**JavaGuide1996**” 备注“**Github**”即可! - -![](../media/pictures/weixin.jpeg) ## 公众号 如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号“**JavaGuide**”。 -**《Java 面试突击》:** 由本文档衍生的专为面试而生的《Java 面试突击》V4.0 PDF 版本[公众号](#公众号)后台回复 **"面试突击"** 即可领取! - -![我的公众号](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/books167598cd2e17b8ec-20220409194658233.png) +![JavaGuide 官方公众号](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/gongzhonghaoxuanchuan.png) diff --git a/docs/readme.md b/docs/readme.md index 0c9693f4..66823868 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -16,19 +16,31 @@ footer: |- 鄂ICP备2020015769号-1 | 主题: VuePress Theme Hope --- -## 网站概览 +
+

+ 阅读 + stars + forks + issues +

+

+ Github | + Gitee +

+
-- [Java 面试指南](./home.md) :一份涵盖大部分 Java 程序员所需要掌握的核心知识。准备 Java 面试,首选 JavaGuide! -- [Java开源项目精选](./open-source-project/readme.md) :收集整理了 Gitee/Github 上非常棒的 Java 开源项目集合。Java 开发必备! -- [Java技术文章精选](/high-quality-technical-articles/) : 精选一些和 Java 相关的优质技术文章,每一篇都值得你阅读 3 遍以上! -- [Java书单精选](/books/) : Java 后端开发值得一读的一些书籍。 -- [走进作者](/about-the-author/) : 个人经历、闲聊杂谈。 +## 关于网站 -## 必看专栏 +- [项目介绍](./javaguide/intro.md) +- [网站历史](./javaguide/history.md) +- [贡献指南](./javaguide/contribution-guideline.md) +- [常见问题](./javaguide/faq.md) -- **[《Java 面试指北》](./zhuanlan/java-mian-shi-zhi-bei.md)** : 与 JavaGuide 开源版的内容互补! -- **[《手写 RPC 框架》](./zhuanlan/handwritten-rpc-framework.md)** : 从零开始基于 Netty+Kyro+Zookeeper 实现一个简易的 RPC 框架。 -- **[《Java 必读源码系列》](./zhuanlan/source-code-reading.md)** :目前已经整理了 Dubbo 2.6.x 、Netty 4.x、SpringBoot 2.1 等框架/中间件的源码 +## 关于作者 + +- [我曾经也是网瘾少年](./about-the-author/internet-addiction-teenager.md) +- [害,毕业三年了!](./about-the-author/my-college-life.md) +- [我的知识星球快 3 岁了!](./about-the-author/zhishixingqiu-two-years.md) ## PDF @@ -40,6 +52,12 @@ footer: |- ## 公众号 -最新更新会第一时间同步在公众号,强烈推荐大家关注一波!另外,公众号上有很多干货不会同步在线阅读网站。 +最新更新会第一时间同步在公众号,推荐关注!另外,公众号上有很多干货不会同步在线阅读网站。 -![我的公众号](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/books167598cd2e17b8ec.png) +
+

+ + + +

+
diff --git a/media/pictures/weixin.jpeg b/media/pictures/weixin.jpeg deleted file mode 100644 index 365cef2e84e35ea30422cdd78bfad2c0fbd6a753..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18036 zcmb5Vb95%bw>J95wyigu*tU%cC$??dwllG9CllMYoe3t^&F?$so^`(a->t5-s;c+y zTDxjhKh?YT(_gD!y8vWqaVc>C2nYZG@_hlmHUJ_3Fi_C{BK=>Nad*B<~1G+-032?l}!07U@-Ljn031P}rMpkM$nkpCF`-w7HL3g+8N5K!1} zIo`Jb^jrM@3cpJ*2oP{cP^hnU06f^Y5E%^l`{okk|I+x@sc{dR1?#XUN{U8Y8~0UE zyont<$vLQygr0i?@K81YB;c8F?)P-z`**`vTXEGChOz%eIt!1yk0vP$X0H?iLp7dV zV$n4Gq4zSu@eAbmh==~E79&$1keW+LASZE5b@1LYu?()D=+NcUvAHY7=mN+>%_76= zv&w|W(eGhdU52b9aNS7@e^Z4v5>1x#v)_ow8*#?0VVxMxmg1>jwn#}LsFM4}Z_`0b6uOlptg>lSWM3VP08pye6neG_W@ zTgu=l4=H4w830f97~ z%BICjBNP7vyL*|)v%Ej=ES&9ff&7b3v-*N{(iwns8N}RD7={96r=3JmD5vvh3Giw5FmM zABcI%gKe`H<_gve9*u@grOua&RR=P`v-ZR8Qw8sQ0mt79hAEz89(gYkyO47vxeGQ+ z^T>9Dyr;CX;_~IJ)f#8wG9f?oHiKJkr0Nd-i1pnAfW$kIpn<=yrA6-U7@ePv!wTLw z!QewX(D%nz4+37d2wzaH1x@MlhtL{;H_;yzOY(nr~cmOSnu?39BML5?Ho}_xQ zyt=R}KdGlYHC|$z7ZNz(=^o%0ZJB!`epaF^`HH@iX$Wxsn z4nU~bohGD??tw)GYRV%#%xXd^9|AN-vX6`h31aCp3NBjh*P@;40+5*!q@JQEO_2ps zG5;y!F;deO=Zb?q&gf!<{26;oj-~X-bYnhc@jZNVRM0B?{dOvYAx3jQxT<(`3l1Vf zWS2=WR_)(WvuZKqSPmc9eW0AC?q#qqoj}Iy6q15ajgImvtZjoubpA^n__v;aGT0y(rOzz(uG!KY%3RCW?)H$mV5!=W=GP>Kn^mj zef^)g4#W3Qj6`6Ql}Bhz6h^yIh4+cc1=UL#&!Fq6@Z7bP1iqn(4;cUg4hjka zfP@AIg9iK7fCPttf(8Ktg#nmq)Rtqa}IXB+V!qDKqS6)vYC~S3K0H}3& zYP_zAc|-&chvQ}e$m7!El`Su>mRjk(ff3MQH4_1K-Rlt8Qi&q?^7`%}M`La_A_VKT z0ks0m>P{U=JZyLS6|zdga*6aGgZOlz*MBLeH|b z@kudiS{76+PAOJ#L}xoUJ$b3~T#3n1BB zAoK*tn@;OKO62WGGc=B{9^2i$oqt@`c9qh9GU6OeygF)d(s)>2cuV|v(daC(3o}vx zdW^T`HCAJD@B>_h9?6lu0NeO?J3=VHPW6O)h}rP8IZF!sT<&Ulc$$=*A!wt1L({1ZZd}pU`L!c{DxYDeYL;mk@8d6t~DW7bAY*`O-{fVr!>vdfy z_C_a9SJD@t#AKV{q}Q+f;No^h&Mn;uFfm}dYO(u}scPH0k?$xGYuFLeRhGBqT{(R& zP)+>lqn`H#$jfo|h9SN$QSh7j0*D4(g9zm4u4#iZ;w7nDOgG z+&q*QGyFsZ{@5_pb!8Nz9Q2?B1f&Ubxj2I;32*W@X<08cx8A~xr~%pe9ZE8UA^l{G zluS+=Qv>p5N33>ZVC#N8<&Z$8w901@#4!Vgkv@X%JimM2a#{)gfyHIWD-o_sPkmd< z_0dddm-7tr`@YjjeFf>usa@lt`%H7-E_ulh8G*eSPhr{DeSbF(l9EheRa=mc(1#%GIE1RO}%es4NF}-}9 zH(n`!VPa`#;OWTytd>o32WhOjh!Ras!VY@F=^(o&{Y^UzuJFo>^;=D`$)WlTq{6x| z$mFMwcW4b_ZiMO&V07Vurxiu~r1BVLZER^<-RFhCzFL^HeLPI8JNbA30sC+za)@vCTL_m?+%E##Q6BTgM0vHkN6Tq_N{Eo1--4PIF8)q}hP` zH;KqY+)urYbe1Q$u6~>b_3=^xU^MT4<`z`1QM5G;R=IvtrtBGLwn32$QU9bhh|AwA zW2XBF1ZH`P>$Y6DlSgpS3R(t8Pod%iu=`i9!}CeWIT0=?5@1E?^g9bt+^){oi_)+a zY9TpVE{mm=bY~G=NhuDcI8G(HR|s_bh)x;!70`l?z*4YDsdC7)kY7@9p&Eq8hGhg| zmO2h0m=-HNVgXVf#WI@4ay|*>Wae2-#G7mU5BE^;!eR1%s;!n#T!5ox(4gYd&k-t! zrm=r$Y3(g-1_bXAK|j1T3MzRJx-c+5B;eE@Qo!14H5$F(hTS&KPdY#w%6ehJb)VSh zevr^liw%_lU1?bhUiEa`nVA_J)<$xt+^@wcUpOa5_p5p2FhwnAS$hkG8N4k-wz{`* zQVZCZ>5*X~VGW#He*hQDZ-E(@M$Ovf0#JHSLf~f{EX(etApMn8O88E>%SX~;-0~bF{c_l9%CKWc8{5Fbj+}N)>6@B5>_%t-3nPTKfF>{c2s|-Y%zH^!$vr>^)@q`c8W&jBMuDyS)mc%FYSoCb&C7~tiHZCt%Jz)BNSH` zlo5Q1t zei5H;rgvOT32lzZgiY+ECul~|DQB{R80<}AP^!0ND%F)7o6n5jeI^b-w&c3bbVqD; zB33gcv!So#OnZZ6Xo0ni)`5E#JAm{dZRMZEF%A9s0$edFButVZjfm-aXW?m};Ev4# z30UJV{MZcifi9Pkl|xE8cC&);=m81ic?6n#Wcrf`+(b^0Q_vfRO0HM`CISg+uN{~% zVS8G9J#Yt%Kcp2Yy9!LKPJWIRxhxh(0D8^-+R#beMAWEM)jMzArOcjk!O*;TPU=wg zI&Cy88ApSLrOJyW83WCL!P=YS+}%yeK7q9Cv%V^6|8}JC|0@SA*;JY)Ft6ylT+%{nxu!NO!&JnYYQj)=!H^8Tv9-W!-r zVKiX&mpsZ9;l^Ab^3a(rahQ{z5Ly;4&tdRUk~%x$s!5cjk0Yc~Tun4=W8Vd3-QN#} ze%2M`*loo9T8!-GAp7;`saMMmNz5S?5<`WjbY%y-P&7f+8g;h5@SCkrt;=e6HVF6J zf7z7kS|dF7=NF(;Of9CtAMm3lDkCMUGXF^kLP<-fTQagiR-T}iMLPbrEVOKDsWDIX z+`fT5@#$Gz!;jq2pu0p(Zn9OPB_ioD!n=9l0G+hE4-FV2lSw?os-+?BV)N*sNH1=d zk5bn#MDd)X=4l+-yOK}QcO0#?rXD1pdJ^FiPCgt9UABlg=4dXS6iCKqd9=qG59Tn* zyhQsvQ^-IR^kQppv{o^|sE5t!VrF)(%)a7C5D*Q!hG9rP-)~#ukoY*mR^&f6D>rPx z1fyw;wVl2){z)1Uu7wFEHuEuUzbjq@V3@SF0MiO>WYiMs*Gz{dG$H zxxBI69PyjK!il^bbk5G9HJx~lDLr3DggEJoDb>XEp^1;hFO6vc4!@-Jb2;QgcZxd3 zS^KG)Y`c6qqG?=7e;7yEfh$Mj8ud@L3x9!udaIFjGe+h(+T~MT7Cp`7|2$Joc)XqYWar}yQ>@R?%(G|$n(AyX&9Q3n zhcn@uSX(VbhALBQaDm|13$ef0EN4hYJ`|KLYh!#134h8|Vu+#VR}tLA7=n&3vgudt zm*yCR&RBM(+CUrIDUI!sDVs!^1f1EIQCh`9juGO_HxUUmpk0v(-t8vbkySXU&ZBG_ z28;x~8v9@3qgftIh15R(<&kD32!tk|jgt?aszR`Sf4LIgOdy;o`H#mlUTXp5K0N*c zw812RwKAIERbS1R4kkxIvp+J)i4v<4Ym+r0Rovn{gh3__?@wQATlXLQSftrM;ZzX^t!fI%8yrtbS%jdipV3~U_V9$+HS z=}xxl>CL$9*ZKCim*WDG$c20Kp@qWE5xMWa0No=YfpMJnOTvS9op?)f2@-rtyg%8A z0bU4$s6S8!`y>_?3;KqSFS_akxV4%bXYYby{j#+odz3D`ow*7vZ4h10Gn1Fdt2`*& z&0S_xz5qC&+j^N4PFBVgSaV?|kWCGnlYFbhos(Dudrq3(y-F~98SM>hPOcUjS1U(A zrt%^3D5-6YoFpImsSbh-RZ`Uf9yGmmL@Yu8VtF`OY0k_~f4NoeQwbXen@U{mPVX4$ zLzi1WkN~#=-oF*XOXHouRMI-JGt=+wJ_}p?uM8yww|E4F#wI%e$2Y#R0zsy@O`HWj zFI@uo3v{a-*spKMId6<1I7e+h*Pg~UgHozL3D-BU^>45{QY($hBAw)?t#E(4%;9wc zIo2LYiJ$&p2zjcUI-H|~+<{eOlhV0<*{jw34BhacHpCl65a^Gl-BnKTiBQwnT$o=P zrH)(I*Hp6>9qi(Mrim~aWazLvWVv;ftR9Bh)AhuRCMUyijGD+>?5pI}d-aJF*BU8h zY2HRt<#TYUB-BN@;QZqH6ot|fvF&E}a3nCi$(dEM?F&_Yv1keuZI~EL@pZ;Z#e~MV zC~Wd~2})WP9{EGfNb`bMLm@H!6R9=7+Ejm(Oju#X7g%7s=ubR7`79l?#7W%Wxu+@h zqj2G@KOV`KMHxDGR~pa;4j;uMpg+};H(P3K8nvy#U1wnkr%o@Eq{_}4Mii<$2+T6( z5qE2|EScuwe*scxiZ^Qb;hrtXC0X(eJJYVM1cE|ibd(VFd801E)@B^?wOCJVjRL)` zy4k4_YEl(b{?WBP(lBhiA0GRWN+&faG{?s8fD%A+MUF@7C^H%|0%w~}d?XrA^?yK% zdml4i9|w+VL9Qjv)=73op<#5W>d;`x`-Q*jC|D={g4vc$VZGK3mPeP z5!fQuplUF%ricat*UdjU(|5GP*t)*z6NoitPQ$N0mc3GvpyEm(aAawNe>hSr=a$4y zTL~zonDM-wxz7Rj{TuS4Ne;Np9gB!2kj7PneQc+Ol3|_=yt#8N2qsVIX%PRjNjUBg zNXK1bR#tcJjAx;UQ0IPd&;@G9Ztf}l4&19Il6li5T+QBaYUOTQ%v4-Z*@9MWL2pMn zRsoTt88#7$OtBHnELm)+C|HyYDGPD>0>D63gnDBwr^V zNG6d5kWKUKR5~0=oo!dX?61;==WH9@kbm3sPw%vwwX1@TxguUDHmAU>wq`Fs2ABH5A z%fNWa1zE@cC zlPrks9K^7?{_o~qag9vo^+&8%&^NLU^Tu@l)JWp%P}Y44{rl( zZWB862q|uDKw&j~Dvk+pb=@O3F4BLH+q-g)Dtx{CVE&&eIWZx^R+fkmm^wNt_*_NI zb)LJqwm3*LL*{{N_{a0qbEDyefwRTsY-k>(_wO{$K7ix?wWpT;13WRRM2ghRSa&cW zu0|%20rpB@GWYtib9JGJ(|*TCj}LQ|~7cr&+(p+xZwdX4RkwnSlOX|EZd;islh=fp@TBrJtD|8%do ziu26PrNzNtZPh2wq3PIYtAAIaq&Ls@P=d1x@Mi@5zvvy#-gKaXt!)yKgDOcUkBkIN zmV`NKCYAPohZf6iR4Ab-Yqg_VtRF|IEy|m3K0A(!X{j2z2CP*A#zcou5a>22n|0sx zx`!}x_C90aw3S;e9wL)1iSsylPKScjBI<1QR70nl&bw=+Kfu z0C0xGm+K3J)-<99CO6me=Ty&(BzjUZLg9_*Wnck2p!jV-KXcuM9)yy5V`P~?`(=|+ zU7M6afhe0FqULkmS&CI48U^ksdt277Y1FAcX)GrJJplhEiHRI# z?#iVFA-$OcLbbADSsZ9s5L&(BIk}TE#O1YgIWP-UOnA$)KjT4c^s&=Wbtb06$GyEwP;y4&AcVwtmcMXF-k6|t!; zodWrOCn$8;7lbV6=rDo6DKM&34bw)(Say3Q0!wOqqa4xSf&jSH9y=;T+l zqh(iw?&U*b^tQp(3fThpdf$;W1!TZ?91ZN7qyP;A1p@`~&0PTfW&i+CP$ALKNtiGi zF^Nf)l%1Ovk;#~a3|w627l0xv4vtO@EW$ZL@gKd@hS(vcHz=_?6* zA<}_>H)yow+%YOWe(*VM1#^!q;-(c~`?wR4 zJ{Z|><#I94edTg9&wUvcJbNJs+`w&HR4%A#sy3wIBQ&?V>mOfC=y2q6`%XI^3G)~S zDw+t6TAUF%yow~e9FtLplTMtQ{2rK;9ANVcpmnNKne(VPK)8n@uVB|f4)!tSCI1Cz zmoxK3B9PQhWuf__Ri#^ARibDtnrx06fqW@}g$S{8YK7rD1l5qVfWkAtGAMaO#e*p) zqD~OQXdI0?ip$f`PCPsbn!q2XGWXqO4kRol&EST(j%9zpI?(De%-pDX)1upU`iBev&wbbtt(o)KE} z!0&6|xP)SixKzFw_`A}tyLPRd|F(9mo&UDX(8KTMFmGg~?$qn0hq95*D|Mybf$(m* zY%3Nw`FCKxq~cA4}?dL9~z7(CN2K!biIjoUz} zQJ#-{NgftmSHVvh^C`Abu|T~OUt7e2G4VLZ0&$~l>iAI(GboqO=?Wr?Xi+!fE`z=2 zo-crnMnbDs9K*lN0QiO}I&csa@yo#rGVc4094Mb>XlStyOF~h zNenvcChQ&pkD~hULPkRu8osPK5S86@rS-LPdv$3NrtwQZJmCuSw zb`|qh4w-~YtVf}ssAc70$1`8_Q^UK0sn!!+t)ZdMQMH#eL*3E})Te`Q#0U2?!S@;O z!Np$ijzMX;5`fA*QQb>wpsyQ*kcP5Gzi>rLic?90;qaz;6AhaF28<0 z_?;BeTV1KK-FV^rHF?gRY`*@beycHRg-1<-+JUpyw_7?Znc1{=(rN{6lBx^ zJi2}6sg;Rng)$dg#3MJ7K>H7)13I4dI94srYh9v8XbT@7fxLDb1?w6A!v zx!cyrq~yvq(JO|qKy~_eKB~*P6Z9#u#Bm4XAglvAK&p(#Qkq*;K;-d_Wv{r{z&n!x zTvS*Z@@v^z`P&#?n}G@2aT944P5O;8aO!Y^ioFmI!R=RC&{1g61MfZi=N~UN`b3oq zttL0r@SsZYkrY?8&S)E(mi+x*e*?lRB65_Og$Ff2XUg)cA@&w<0>X-($Xb~iys6!z zTCIo1p3mXzwOc;OT2N<)%YRVZCt%(_;SwyQRw$^7w3VYk#*$T3Xqbuj^XAK*(#1L<~D0=`PRPU zW^+O7dcpdKfS;iSDkKbaT}Rx5-Xzto?Y#P6Q=%y63u}-b??sSc5`&no)G=+p>P0wq zrEDE+BvzIyi+}#Qba}`Wa9&w1`&iJ^DtwajF^$_|^CNXspwQX3P!mB{vgT3xy%9~O ziCrW5z^uH&7O$B>5nm>$^t1)J(NfQ-%A}G{3tClD6vwJP@Mq@uvy*cP?koj$Ay;QJ z9T;b{N$jamR@cH<@RIAqB_$I0hOpqUx$LeYC9bv@A0A9F+r|0*vE_nc?wRW?EC(_? z#8;tBfR63eg<-;DN6{UW@)UpmpoQ9*qoM2nC;1@;)tRxLhTV11kTh-tiK5Iw}cFhR|5NQWFwV7p?y=ab|0Me z>lvB~gSc&SHjarG>7c00POR7}jTO`!=BZll9;8_;_hf~3McLf+${T&7`lWH{P2)T? zFxM>Q512+gh>wru_bmO-#A$lYsiv?nfIug7a_+5%3Y6YDs>RS8$8gaxC6h_j{{)Xq zEIQ?Ok*ab`9m+Eu5&iK6AlV!6nH_7TGu#`E`c$j$Ok<1o6YTlJ<&s#AunPC!bK@=< zu;Q@JJ*Ah%A$B{wt%DjL3N2}&2?8#K9(?}iS2Z}gqwAdtFpX}|G7eUe=JIzwm3--N zBnZRN_5Lx-a;gLW4bV*emTk9+X3onvfhlQ{qCq^r>aI`U5jC5M{k9I=yJ^{MtsuTq z=-Ojw-zzH^>a3)ZLyt!|VL}TvlbxC~7}o^c(u147JHhXY?VmpYQfn0eQg?TK-Xf}c zk~z7`&K{^g{TsXJ3qV-fm2Bj>m^+8Y-HEUSLW~^Emd80MXHJnj&5gpECFmgvy^58< zL5|o_^mF(CNg?A--o$?`Q(j*<7$HxByCs@(Foh9Tn6Ha+W}8Svhm~$_B5T=ZPb${| ztWUVecpO9NK?YB&IS|MUMk-oy$aHVV=slD14hmn)nZG@?OU_|*WrJ+`Px5eCBN9Wj z?H3am>!27my&wR~MmJxpS_#r{>W*B(i0q1)0kDIGW4={Iy_H%CBh73#&J6QH>!Oy| zpY6gVY~}V&n_NH(UZ6Aa$?5N9QyD5Aty|1ydosUIF1BMUvf$H-cV5hSt`-UpzHCa3 zuE(sg84r0FvP}BkW(fn*8jK`50AG}@CAZ;WoTLCm!>-hF$8VCwW!V(Q8};{&tt>7- zh@48R+dDeEmT9MTGgQb}f~WhT2%Bb7B^rGML&41Ya;b`@dNpdwB&P-gB-r=3)_kx% z%6A`pV)jNsf%W0XJ(~_Lq*3WTPa4r8R@&cW@2~;u-u%J7OiHE?-Z$6o_`gQAim*D!AQ|)l7#_luR<9zp&9b@p!?*K z%yXspK$&JJuF1G*y){BM8EVUPGR5Ia$%%?d`dPPJI^35r!5+1yF%}IilWW{kJh{S1 zp#?+3^Si3ho*dRCVsf)w`Tc{%VxKK>Vgx+Y_k7p`kXfCRMSz^IxFUor0v5A4`UOx> zGxazk6R-!p9&9bVAb{kcgkiHao?X?{6-OY3mmj8b6JF03hB-?JY>YV}8{ZqgXK{K? zz8Eu@=WAyaqZQow-jVz+`5&sbI<~|h5s%cdf=x5~`*So(>QHo~#Gc91x_20n)dL7~ zVw^+Xb7>qx0lb%Fsen;(7Z5)Y_6}#cg`~yvOj4+^p4ZHB!^|(k06Q33eNCtl$-|vghb+On997Z4JrbaRpafXq+n+ zaDYUCU4l#_vY8GovFs77>R1spWW$h$d%y*{!e*g@M1mqZ@dcC%r17H9l<$bn#D1wF zx<(h8Fj*H`jJ8Kf-uNClzL!$7ljQ-3WP85H_7v|bpMTcrQJp`vglC->*u7AFhF_36I986MeZM$=pVgiP~&nv>8=Bb zO6o)4X8u)&)dN4r_4-tnhxN2w+4(cAQ`Zg85YH$qDO7Svtx6VIV)a5`t~h1;q{P%@ zpmJ$bX3l>05+9Qmu@1ERhI_u+BHo6q+&dk=QP1_!Q!1uSMo^COkdSGUc#PIN&|(W_ z8#_t;H3$KsBN&xDc(zJUQwXJvG%p}qVy3mtjX!5(LrrvCpiImOGMuIlWHgbCg-b9#a)jF{YZku)nnCdUK<=#q$g~ zjd|^g1D^1iD#V?Aed0x)*pr@TRb{1-xgX}g+4eKBw-q5AaL+^a%BhzsKhRM!5?Pm| zKT%<>GB{%C#oA(Np(@eJ9GTT>zrW&T=OjUK(gne~ZB%YPqK=DDk}m}ui4t&W2qzL=kI;>IVpKkb7x>l?FS zRZb9*R<{da!+CT*Zyqjv5G1zb9yfe~5KLcx;XuVQy1nrlg*;u|>FOm^)ldxGGY-QF zBNvUF0)2$&xN{+41`&r%Q37!Sa6RLqv8n3|Np}}A`{+$khxwKK3afg!yEO(e6I(&? zr_Ogj_$cL~R@Ys1DA|f6E0>)nLE1?POmu9fO#kW9ND+*XMq(2rxUDI# z3t_-;cW}#O*`3{L@8FR zC@At3^s7|Ax#crpypCj%Hi>ITMQaFQ8r~BhNG&s>+$sB=N&`dPvoP~1cuyAQc4oz< zl?+gBipQRWH1xS{Y>VRDbJWh3Pry+uWd^mlcgg!`MpL!Z8|{_ukHx@;56Q)Yqhmoz z*m=eMutU1G^m1W9p{^Wb#LG7}kZD=hh2-L_s2jnP< zdQrz_wHc@bN$f6ulpmubV#|XQgcZXi@`Y2HGWVn>PAX*VtcbUVrgB%WlC4u20z;TX z6fw~5TXNqM_k4+pe=LWxG(*2YfcfX#@|OnQ&*v{X&UXs7HR2SBl4P`^*b2GK2CvH^ zi=%E_2|NA< z+yM@m;QUo$nVszsy8uIgt(YtDf^4_K)ov|N^U%UIw&Pyn>QctKvu?53B3kntcd-`H z;DiMo)@1JjvCR4C?0l;dgy&@O4q{cKqRwqYkUG zPWJPz2O(l^aH=7SIK9Rtzpz>eZzb83*Cat8yW!0SP=2P@Tr{G6Seu6%j{4-2%cZ5CMc%&Ge}EjG9~i(&^2j&Ajm?u@ zG(7MhzivX^eW9cN(Vz6^vI?c{loBNSRE>FE3NSsP>9byL!EMWDxI&lp5+ybg!SxK
uWQJ3)$U2Emz$YINlN=fyP2aDxBH@hH4cB!7hpo^YFaZgSm%R- z=YoYBuP%$GRx<;Y%UEL!WF;JtUvWw6cDR~VOh{EHfbf@J)@SuUxA(A3qJ^`wvRCQ7 zA84rtU5>ATkd?~gh=bS@v0zh%gYgNh4$0tQa)u<;Y_&v7PZckcI^u(p+tuiq`ST2c zql1>en&NyaKE1?XIq3E8=_*~}r_(P}G9ynWsSVI0VKye5jvD-Z5Fh#Tm*AZM;aTdvE_kia_?Q2ub``$0u|}9GTvXe zPS)1a~SCx!P*ItqqNZOFpwNVEEEnJKdK2oBUR4P&Q5n8Q?>H2WFVYao?a*p>E ziz{$pgDPUXloSlDvsflo_}!76~wyh3YT*~aZ9RE~0@94X45!t`h$)3Z(EfqK|2}0CdFVLl zzg`d%hqhBm@zCzn+l`i@pQT;(+8Pb9W%S31CujJ!coym zbfr;p)W`9hV>uUFJL;rDcB@SAC=WAG!R&Bb?$6hg8~O6dR@2r+MOUieLR(-uR7{a6 zFpn5ZeF!y`s%tA?zr@^VCo%NS1b9)F2v4987(shqbZ%BBQ&hm06lld|%j*o|gdc&z z{C?8m;;2H0%k^%MD{Bt?3!6aWBy`$YW>5$cz{45Q^XPnQx7vi@d%cr-)}7OLRQhQ; zy>N{LB^1GFO7Xp@<23p^4bFdHi0dz4BKA5=ir-x|_W;qStfxm+JM zBn&Fi)g0)|(0n3j+xTfF8@K-?qp|qX?T)kse~hX)Q|Kgf z#;M*r6fH5Rxl=?xTf|PrVx+15FzNgp8J@9g(pbC-yCSn92q@I4hSs=@sC(=}Y0?NOsylB`?4cFbB4_!9sea&6 z2Z|s`NNMtx{;84)b0~#enkG+be(xP|Zvzd9NGly-Ty-ijFZlCv2*HTan`kUS*vd*%jgq%DFXy%naBJUF`_(W5V=3OWmdz zVVrD-_~VJBVjdP^$lX|&m{+RG@IyfFI7*{+c;RaEDZOGCWV2}ElaSphkTB2m) zVu68#dWb~td6vW=KM^x+B=(ds8ad<4s!|4K(ezw?yNy_azsNIw)5?5owuv}h9}%kn z!cR3reba(#)Ks7fH}l5*td^(WUV2KK*HK@SjV{Gv6chVgNAZd}a<=w;?BDCTqNA1H9dB1c6^Z!M_%G{0=w%w0x2f*VTMpLLS*M7O=HyV{go`e%YG%G@x{ zaQ_d|aq}A&$M%Etr+i$qZq{hr?quYzCZHOAr&qv?=Gf6WmEFEF4HGG&B)qW#7cdC2 zcCi=Sg~nbAq~4M`Iq{GoK02t%ts$b)T>P8rM_y;*OW#>`$QE9X(VF^xBMC&690h$` z>xT7~AIzof{Zwckygz#7{M&mv*ArCs1-QJK^XMWnwVm{hiD-96WOhXnN~3T0z%yGbtL;I8jObu3L_ASRJfH@<7OtyFZqPtOWyek{ z2&QT#lhALh2%QvcOwVH-Hn)iYt9%g3hK9F}ED3FVZ}^7%1(4B^xI7#pENa)SYq5IH zJrySBNk*fnHF#H0*cj?^bld7P&n4X<34n5_K$d|JaaM$6{QgyiQmDf5;CE^bLmji? zXp7-5N#XZ8;Run7^{4#X)>Gj8jRXj*!^lvyV3qMr_u*&W;q6Ho)e%J_+Z=RVh)MQ} zAsIpUpfD*LgVh}MYwPFcxoviB()ck$$Dn`ufD~;opir-7_v1zq1?#dMxrU8*Si z&mUn|l70vmbr2x)Ok_(^k@C}4AGy@*RepD3Avp5AouE!=ReoSLhMYvkiOrz7KfxGX zWqPK)5M3kYf^1^DJtvR1OiEFWu~NI>sk*&@_}c}8ay4_>ZX^?|pz)7Zq`da3Pv&9f zUy8rYB21$5O`t~O5f6OK=)`O#dcl>jGmuLLS^&#V#;vzC=l;|ngf_V^yiJ_6I zhIlyOW>Q%rv2~yzKykQIPpVR$nI$l2kt64_R)p-K@kd3BbhpR6rgVmTn9esV!6iXb zfXDEbh`S|?C84w@kcx$W7!qI{po{~JPX0YSz;^WgW9vZC%m&E>lvZDAOp3 zQQ6$)bEu>?SjX!HpjdX>W z^NDRim@Y7+n|E)I5E`j6Mgc+aeyF@IVNzs(zD1jLL9R zFKa}4uVDNQ(wWaTny zxN#E+-@a!?#hO-o_--S*eJF(}NKhprZc%!G;<2O3=B3lE_p_T$6Ekz4KDHD@f`y?4 zkneMb;LYGuk59CObNz#=l&a|ZCzeVb55jPF(=jZ|gHUc;sLY@WoJxnP@LwbhutTej z7b1^mCic44nnT@p$ukHpWz9`t1(rdIUe&En#D--aMddJRM_lG*wtY1P_{qw?wlsSc z-PQ6(*2Q+-!KL$=#Tio&@Dde8*id1Bq9OoG52E-@=Im-AfjmEj^9-EkZJein(O*2q zywn}7vU*JfJ^#2#ZT+J>Ad zdP1h`x~>es^b9Bn=lXq;K_=m+h+=mt7V!v^Q@NUJT+4Q-#ww&Sf2t!(KD>`OR1I%2 z@T-9_#3F0b*Am||-NU|KM3GkCF0FtdM~2Ia!BZ2}`V3fV6JL;pWIA)^n+_2oVS!+$ zwSf1|TfJUgkpJ9C{VP8~+(uYbC+m+B^c(7p8}qn>e0(%fZdz?C^fa7}LKohl)_ar; zhICX0G?<`Y&cwmP{=poJvD8!s8IgC4-;fVIKqoqYT^Fur<1@w^iR*JDGU|_8Fr-|Y ztJ_{x@nH5;f`=4A6ABeU$@@j^-^&XE!GlCzi{yL}GA_!DMQkgM;O7Od^e$yVfA7XR zJh{q;I@Tk1S47lb%7Z%x%UV^crm}-K?y0V4*?IgNeM3zVn$4{Q! z6s;5|ej^nWwApiHPts(HeY8hbNZbhXo;aTx@O8MT=62_&&<_890xJd7`e-BJItPr& zvavz21dWN;>#6?dtZgjCDNH1~7m7%te|M^Q>Q!g0XEkc0mx|2NN_%le%0ncGG?|*$ z-DYxb(& z@wGz@R-IT)!8Dz?=7m%eShF5F_+K~JY3kJPJkvi=+=&d5Id(gDKpVEJO*GMly4JRN z9K3|c?8N+{Pnp-&qyGS&vh^mTW5Ui*yfPt23nCCy>`3INaCMTuYAYtq`RxLc#*6?G zyJ^*%`oN zxos1~JkkUN{M(W>J~k9fuyoy<;mpvHFcZXh>V--sft+5&?n}-eW3*-VREJ$2BBhMA zZ>H_rM5i1GcY8&`5Tw4kTHk=ij62Vb0xJ;3EWyNbo_mx{K~jYZc-myzvP4#(0YWDy zB~)r?UU=ibN@~o?Ic!48ib&jgfwrWe)Qr}0wrwwJLmRjYBeIRmX{?%JQqZ|eocmj_ z(9N{Hzy`=S1gX{NBdcf}w6}JOHYETOJ8=N~OO+-7x3zpvDje-~HtFOx~>S9nnYf(W>5?8o_?PjaoV6LteUKtm{Ur4)j9)KcA( z#nXVp3Gd48076LtdF%BQzrU;euv?!n1d#5U#e$Kk~vhURUm?Un#H}hHtIrQiTl>2oCQKj z011Bve-URJ9jTPELS>AgVx!D~tkw9gqtUGJ1mh5lf*qLZ&QmXZW0HfU;9WA69ny9s zJG#c=PB_7GoU^-@m7KUL<4A!?AE0Q^t4LJ4MrogTyT3uyY~75<$LsA{QCl4l6O6I)97wMx|?K>`BuiUR%- z{{a8Q04Nav0R#XB00sjA000000000100ILM1O*ZyF+dX(B0)lcAR{tS|Jncu0RsU6 zKLGkj9MG&3+XHg73*4rV@PGrVQ>3d=>;C{$xT6wwEEeqKWG*Dy%jR?TL>{aCAg?;+ z5}BB@b%@3~P7@x3)=~58JXk617ExnQ@}kS7lvqWC6wtDdpIQ4xQ-g$u(w%JfwS$vX zHB^q0<6$;9ebx!BJave%NZ?rGdRLQdCyQPu?9)_)E`I?WzGrZ-xMxGkzPyo#g!~1Y TQ9vVJDQYjiz#o7gNk9MDs|yW#