diff --git a/README.md b/README.md
index 8a89d065d1f..47281b24793 100644
--- a/README.md
+++ b/README.md
@@ -1,13 +1,14 @@
-👍《JavaGuide 面试突击版》PDF 版本+3 本 PDF Java 学习手册,在公众号 **[JavaGuide](#公众号)** 后台回复“**面试突击**”即可获取。
+👍推荐 [0.73折购买阿里云服务器!1核2G 84元即可薅1年,力度很大,推荐3年(新用户优惠更大,非新人的话可用朋友/亲人的身份证购买)](https://www.aliyun.com/1111/pintuan-share?ptCode=MTUyNTA5NzQ1MTc4MDE0OHx8MTE0fDE%3D&userCode=hf47liqn)
-👍 图解操作系统+HTTP+计算机网络的 PDF 资料[点此链接即可下载](https://cowtransfer.com/s/fbed14f0c22a4d)。
+👍推荐 [在线阅读](https://snailclimb.gitee.io/javaguide) (Github 访问速度比较慢可能会导致部分图片无法刷新出来)
-> 一些闲话:
->
-> 1. **JavaGuide 介绍**:关于 JavaGuide 的相关介绍请看:[关于 JavaGuide 的一些说明](https://www.yuque.com/snailclimb/dr6cvl/mr44yt#vu3ok) 。PDF 版本请看:[完结撒花!JavaGuide 面试突击版来啦!](./docs/javaguide面试突击版.md) 。
-> 2. **在线阅读** :如果 Github 访问速度比较慢或者图片无法刷新出来的话,可以转移到[码云](https://gitee.com/SnailClimb/JavaGuide)查看或者[在线阅读](https://snailclimb.gitee.io/javaguide)。如果你要提交 issue 或者 pr 的话建议到 [Github](https://github.com/Snailclimb/JavaGuide) 提交。
+👍推荐 [图解Java+操作系统+HTTP+计算机网络的 PDF 资料](#优质原创PDF资源)
+
+## 一些闲话:
+
+> 1. **介绍**:关于 JavaGuide 的相关介绍请看:[关于 JavaGuide 的一些说明](https://www.yuque.com/snailclimb/dr6cvl/mr44yt#vu3ok) 。PDF 版本请看:[完结撒花!JavaGuide 面试突击版来啦!](./docs/javaguide面试突击版.md) 。
+>2. **PDF版本** : [《JavaGuide 面试突击版》PDF 版本](#公众号) 。
> 3. **面试专版** :准备面试的小伙伴可以考虑面试专版:[《Java 面试进阶指南》](https://xiaozhuanlan.com/javainterview?rel=javaguide) ,欢迎加入[我的星球](https://wx.zsxq.com/dweb2/index/group/48418884588288)获取更多实用干货。
-> 4. **阿里云活动** :阿里云最近在做活动,服务器不到 10 元/月,小伙伴们搭建一个网站提高简历质量。支持国内开源做的比较好的公司
> 5. **联系我** :如要进群或者请教问题,请[联系我](#联系我) (备注来自 Github。请直入问题,工作时间不回复)。
> 6. **转载须知** :以下所有文章如非文首说明皆为我(Guide哥)的原创,转载在文首注明出处,如发现恶意抄袭/搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!⛽️
@@ -98,7 +99,7 @@
- [待办](#待办)
- [联系我](#联系我)
- [捐赠支持](#捐赠支持)
- - [Contributor](#contributor)
+ - [Contributor](#贡献者)
- [公众号](#公众号)
@@ -116,9 +117,9 @@
**重要知识点详解:**
1. [枚举](docs/java/basis/用好Java中的枚举真的没有那么简单.md) (很重要的一个数据结构,用好枚举真的没有那么简单!)
-2. [Java 常见关键字总结:final、static、this、super!](docs/java/basis/Java常见关键字总结:final,static,this,super.md)
-3. [什么是反射机制?反射机制的应用场景有哪些?](docs/java/basis/什么是反射机制?反射机制的应用场景有哪些?.md)
-4. [代理模式详解:静态代理+JDK/CGLIB 动态代理实战](docs/java/basis/静态代理+JDK,CGLIB动态代理实战.md)
+2. [Java 常见关键字总结:final、static、this、super!](docs/java/basis/Java常见关键字总结.md)
+3. [什么是反射机制?反射机制的应用场景有哪些?](docs/java/basis/反射机制.md)
+4. [代理模式详解:静态代理+JDK/CGLIB 动态代理实战](docs/java/basis/代理模式详解.md)
5. [BIO,NIO,AIO 总结 ](docs/java/basis/BIO,NIO,AIO总结.md)
### 容器
@@ -181,7 +182,10 @@
### 算法
-算法这部分内容非常重要,如果你不知道如何学习算法的话,可以看下我写的:[《硬核的算法学习书籍+资源推荐》](docs/dataStructures-algorithms/算法学习资源推荐.md) 。
+算法这部分内容非常重要,如果你不知道如何学习算法的话,可以看下我写的:
+
+- [算法学习书籍+资源推荐](https://www.zhihu.com/question/323359308/answer/1545320858) 。
+- [如何刷Leetcode?](https://www.zhihu.com/question/31092580/answer/1534887374)
**常见算法问题总结:**
@@ -418,15 +422,24 @@ CAP 也就是 Consistency(一致性)、Availability(可用性)、Partiti
## 其他
+### 贡献者
+
+[你可以点此链接查看JavaGuide的所有贡献者。](https://github.com/Snailclimb/JavaGuide/graphs/contributors) 感谢你们让 JavaGuide 变得更好!如果你们来到武汉一定要找我,我请你们吃饭玩耍。
+
+*悄悄话:JavaGuide 会不定时为贡献者们送福利。*
+
### 待办
- [x] Netty 总结
- [ ] 数据结构总结重构
-- [ ] 将 JavaGuide 的基础知识部分抽出来单独弄一个 CS-Guide
-### 联系我
+### 优质原创PDF资源
-
+
+
+为了避免恶意传播,微信搜“**Github掘金计划**”后台回复**“006”**即可获取。
+
+ https://labs.ripe.net/Members/fergalc/ixp-traffic-during-stratos-skydive http://conexionesmanwman.blogspot.com/ https://www.itrelease.com/2018/07/advantages-and-disadvantages-of-personal-area-network-pan/ https://www.seobility.net/en/wiki/HTTP_headers https://www.campaignmonitor.com/resources/knowledge-base/what-is-the-code-that-makes-bcc-or-cc-operate-in-an-email/
+
11. **搜索引擎** :搜索引擎(Search Engine)是指根据一定的策略、运用特定的计算机程序从互联网上搜集信息,在对信息进行组织和处理后,为用户提供检索服务,将用户检索相关的信息展示给用户的系统。搜索引擎包括全文索引、目录索引、元搜索引擎、垂直搜索引擎、集合式搜索引擎、门户搜索引擎与免费链接列表等。
+
+
+
12. **垂直搜索引擎** :垂直搜索引擎是针对某一个行业的专业搜索引擎,是搜索引擎的细分和延伸,是对网页库中的某类专门的信息进行一次整合,定向分字段抽取出需要的数据进行处理后再以某种形式返回给用户。垂直搜索是相对通用搜索引擎的信息量大、查询不准确、深度不够等提出来的新的搜索引擎服务模式,通过针对某一特定领域、某一特定人群或某一特定需求提供的有一定价值的信息和相关服务。其特点就是“专、精、深”,且具有行业色彩,相比较通用搜索引擎的海量信息无序化,垂直搜索引擎则显得更加专注、具体和深入。
13. **全文索引** :全文索引技术是目前搜索引擎的关键技术。试想在 1M 大小的文件中搜索一个词,可能需要几秒,在 100M 的文件中可能需要几十秒,如果在更大的文件中搜索那么就需要更大的系统开销,这样的开销是不现实的。所以在这样的矛盾下出现了全文索引技术,有时候有人叫倒排文档技术。
14. **目录索引** :目录索引( search index/directory),顾名思义就是将网站分门别类地存放在相应的目录中,因此用户在查询信息时,可选择关键词搜索,也可按分类目录逐层查找。
diff --git a/docs/operating-system/Shell.md b/docs/operating-system/Shell.md
index 4a89061fc27..c88ebdd6939 100644
--- a/docs/operating-system/Shell.md
+++ b/docs/operating-system/Shell.md
@@ -262,7 +262,7 @@ echo $length2 #输出:5
echo ${array[2]} #输出:3
unset array[1]# 删除下标为1的元素也就是删除第二个元素
for i in ${array[@]};do echo $i ;done # 遍历数组,输出: 1 3 4 5
-unset arr_number; # 删除数组中的所有元素
+unset array; # 删除数组中的所有元素
for i in ${array[@]};do echo $i ;done # 遍历数组,数组元素为空,没有任何输出内容
```
diff --git a/docs/operating-system/basis.md b/docs/operating-system/basis.md
index af49fd46fd6..ba0c8b53598 100644
--- a/docs/operating-system/basis.md
+++ b/docs/operating-system/basis.md
@@ -64,7 +64,7 @@
🙋 **我:** 好的! 下图是 Java 内存区域,我们从 JVM 的角度来说一下线程和进程之间的关系吧!
-> 如果你对 Java 内存区域 (运行时数据区) 这部分知识不太了解的话可以阅读一下这篇文章:[《可能是把 Java 内存区域讲的最清楚的一篇文章》](<[https://snailclimb.gitee.io/javaguide/#/docs/java/jvm/Java%E5%86%85%E5%AD%98%E5%8C%BA%E5%9F%9F](https://snailclimb.gitee.io/javaguide/#/docs/java/jvm/Java内存区域)>)
+> 如果你对 Java 内存区域 (运行时数据区) 这部分知识不太了解的话可以阅读一下这篇文章:[《可能是把 Java 内存区域讲的最清楚的一篇文章》](https://snailclimb.gitee.io/javaguide/#/docs/java/jvm/Java内存区域)

diff --git a/docs/system-design/distributed-system/message-queue/message-queue.md b/docs/system-design/distributed-system/message-queue/message-queue.md
index a0db7269cbb..ed7461eb9a3 100644
--- a/docs/system-design/distributed-system/message-queue/message-queue.md
+++ b/docs/system-design/distributed-system/message-queue/message-queue.md
@@ -1,22 +1,3 @@
-
-
-- [消息队列其实很简单](#消息队列其实很简单)
- - [一 什么是消息队列](#一-什么是消息队列)
- - [二 为什么要用消息队列](#二-为什么要用消息队列)
- - [\(1\) 通过异步处理提高系统性能(削峰、减少响应所需时间)](#1-通过异步处理提高系统性能削峰减少响应所需时间)
- - [\(2\) 降低系统耦合性](#2-降低系统耦合性)
- - [三 使用消息队列带来的一些问题](#三-使用消息队列带来的一些问题)
- - [四 JMS VS AMQP](#四-jms-vs-amqp)
- - [4.1 JMS](#41-jms)
- - [4.1.1 JMS 简介](#411-jms-简介)
- - [4.1.2 JMS两种消息模型](#412-jms两种消息模型)
- - [4.1.3 JMS 五种不同的消息正文格式](#413-jms-五种不同的消息正文格式)
- - [4.2 AMQP](#42-amqp)
- - [4.3 JMS vs AMQP](#43-jms-vs-amqp)
- - [五 常见的消息队列对比](#五-常见的消息队列对比)
-
-
-
# 消息队列其实很简单
@@ -24,36 +5,48 @@
## 一 什么是消息队列
-我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用。消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。目前使用较多的消息队列有ActiveMQ,RabbitMQ,Kafka,RocketMQ,我们后面会一一对比这些消息队列。
+**我们可以把消息队列看作是一个存放消息的容器,当我们需要使用消息的时候,直接从容器中取出消息供自己使用即可。**
+
+
-另外,我们知道队列 Queue 是一种先进先出的数据结构,所以消费消息时也是按照顺序来消费的。比如生产者发送消息1,2,3...对于消费者就会按照1,2,3...的顺序来消费。但是偶尔也会出现消息被消费的顺序不对的情况,比如某个消息消费失败又或者一个 queue 多个consumer 也会导致消息被消费的顺序不对,我们一定要保证消息被消费的顺序正确。
+消息队列是分布式系统中重要的组件之一。使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。
-除了上面说的消息消费顺序的问题,使用消息队列,我们还要考虑如何保证消息不被重复消费?如何保证消息的可靠性传输(如何处理消息丢失的问题)?......等等问题。所以说使用消息队列也不是十全十美的,使用它也会让系统可用性降低、复杂度提高,另外需要我们保障一致性等问题。
+我们知道队列 Queue 是一种先进先出的数据结构,所以消费消息时也是按照顺序来消费的。
## 二 为什么要用消息队列
-我觉得使用消息队列主要有两点好处:
+我觉得使用消息队列主要有三点好处:
-1. 通过异步处理提高系统性能(削峰、减少响应所需时间)
-2. 降低系统耦合性。
+1. **通过异步处理提高系统性能(减少响应所需时间)。**
+2. **削峰/限流**
+3. **降低系统耦合性。**
如果在面试的时候你被面试官问到这个问题的话,一般情况是你在你的简历上涉及到消息队列这方面的内容,这个时候推荐你结合你自己的项目来回答。
《大型网站技术架构》第四章和第七章均有提到消息队列对应用性能及扩展性的提升。
-### (1) 通过异步处理提高系统性能(削峰、减少响应所需时间)
+### 2.1 通过异步处理提高系统性能(减少响应所需时间)
+
+

-如上图,**在不使用消息队列服务器的时候,用户的请求数据直接写入数据库,在高并发的情况下数据库压力剧增,使得响应速度变慢。但是在使用消息队列之后,用户的请求数据发送给消息队列之后立即返回,再由消息队列的消费者进程从消息队列中获取数据,异步写入数据库。由于消息队列服务器处理速度快于数据库(消息队列也比数据库有更好的伸缩性),因此响应速度得到大幅改善。**
-通过以上分析我们可以得出**消息队列具有很好的削峰作用的功能**——即**通过异步处理,将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务。** 举例:在电子商务一些秒杀、促销活动中,合理使用消息队列可以有效抵御促销活动刚开始大量订单涌入对系统的冲击。如下图所示:
-
+
+将用户的请求数据存储到消息队列之后就立即返回结果。随后,系统再对消息进行消费。
因为**用户请求数据写入消息队列之后就立即返回给用户了,但是请求数据在后续的业务校验、写数据库等操作中可能失败**。因此使用消息队列进行异步处理之后,需要**适当修改业务流程进行配合**,比如**用户在提交订单之后,订单数据写入消息队列,不能立即返回用户订单提交成功,需要在消息队列的订单消费者进程真正处理完该订单之后,甚至出库后,再通过电子邮件或短信通知用户订单成功**,以免交易纠纷。这就类似我们平时手机订火车票和电影票。
-### (2) 降低系统耦合性
+### 2.2 削峰/限流
+
+**先将短时间高并发产生的事务消息存储在消息队列中,然后后端服务再慢慢根据自己的能力去消费这些消息,这样就避免直接把后端服务打垮掉。**
+
+举例:在电子商务一些秒杀、促销活动中,合理使用消息队列可以有效抵御促销活动刚开始大量订单涌入对系统的冲击。如下图所示:
+
+
+
+### 2.3 降低系统耦合性
使用消息队列还可以降低系统耦合性。我们知道如果模块之间不存在直接调用,那么新增模块或者修改模块就对其他模块影响较小,这样系统的可扩展性无疑更好一些。还是直接上图吧:
diff --git a/docs/system-design/high-availability/limit-request.md b/docs/system-design/high-availability/limit-request.md
index 3d42c29a146..e7e64accc04 100644
--- a/docs/system-design/high-availability/limit-request.md
+++ b/docs/system-design/high-availability/limit-request.md
@@ -6,7 +6,7 @@
#### 固定窗口计数器算法
-规定我们单位时间处理的请求数量。比如我们规定我们的一个接口一分钟只能访问10次的话。使用固定窗口计数器算法的话可以这样实现:给定一个变量counter来记录处理的请求数量,当1分钟之内处理一个请求之后counter+1,1分钟之内的如果counter=100的话,后续的请求就会被全部拒绝。等到 1分钟结束后,将counter回归成0,重新开始计数(ps:只要过了一个周期就讲counter回归成0)。
+该算法规定我们单位时间处理的请求数量。比如我们规定我们的一个接口一分钟只能访问10次的话。使用固定窗口计数器算法的话可以这样实现:给定一个变量counter来记录处理的请求数量,当1分钟之内处理一个请求之后counter+1,1分钟之内的如果counter=100的话,后续的请求就会被全部拒绝。等到 1分钟结束后,将counter回归成0,重新开始计数(ps:只要过了一个周期就讲counter回归成0)。
这种限流算法无法保证限流速率,因而无法保证突然激增的流量。比如我们限制一个接口一分钟只能访问10次的话,前半分钟一个请求没有接收,后半分钟接收了10个请求。
@@ -14,7 +14,7 @@
#### 滑动窗口计数器算法
-算的上是固定窗口计数器算法的升级版。滑动窗口计数器算法相比于固定窗口计数器算法的优化在于:它把时间以一定比例分片。例如我们的借口限流每分钟处理60个请求,我们可以把 1 分钟分为60个窗口。每隔1秒移动一次,每个窗口一秒只能处理 不大于 60(请求数)/60(窗口数) 的请求, 如果当前窗口的请求计数总和超过了限制的数量的话就不再处理其他请求。
+该算法算的上是固定窗口计数器算法的升级版。滑动窗口计数器算法相比于固定窗口计数器算法的优化在于:它把时间以一定比例分片。例如我们的接口限流每分钟处理60个请求,我们可以把 1 分钟分为60个窗口。每隔1秒移动一次,每个窗口一秒只能处理 不大于 60(请求数)/60(窗口数) 的请求, 如果当前窗口的请求计数总和超过了限制的数量的话就不再处理其他请求。
很显然:当滑动窗口的格子划分的越多,滑动窗口的滚动就越平滑,限流的统计就会越精确。
@@ -32,4 +32,4 @@

-###
\ No newline at end of file
+###
### 捐赠支持
@@ -434,67 +447,16 @@ CAP 也就是 Consistency(一致性)、Availability(可用性)、Partiti
[点击捐赠支持作者](https://www.yuque.com/snailclimb/dr6cvl/mr44yt#vu3ok)
-### Contributor
+### 联系我
-下面是笔主收集的一些对本仓库提过有价值的 pr 或者 issue 的朋友,人数较多,如果你也对本仓库提过不错的 pr 或者 issue 的话,你可以加我的微信与我联系。下面的排名不分先后!
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
### 公众号
-如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号。
+如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号“**JavaGuide**”。
-**《Java 面试突击》:** 由本文档衍生的专为面试而生的《Java 面试突击》V2.0 PDF 版本[公众号](#公众号)后台回复 **"Java 面试突击"** 即可免费领取!
+**《Java 面试突击》:** 由本文档衍生的专为面试而生的《Java 面试突击》V3.0 PDF 版本[公众号](#公众号)后台回复 **"面试突击"** 即可免费领取!
-**Java 工程师必备学习资源:** 一些 Java 工程师常用学习资源公众号后台回复关键字 **“1”** 即可免费无套路获取。
+
-
\ No newline at end of file
diff --git a/docs/dataStructures-algorithms/images/Github-CodingInterviews.png b/docs/dataStructures-algorithms/images/Github-CodingInterviews.png
deleted file mode 100644
index a02d8a12e6e..00000000000
Binary files a/docs/dataStructures-algorithms/images/Github-CodingInterviews.png and /dev/null differ
diff --git "a/docs/dataStructures-algorithms/images/\345\211\221\346\214\207Offer.png" "b/docs/dataStructures-algorithms/images/\345\211\221\346\214\207Offer.png"
deleted file mode 100644
index 90c296a01fe..00000000000
Binary files "a/docs/dataStructures-algorithms/images/\345\211\221\346\214\207Offer.png" and /dev/null differ
diff --git "a/docs/dataStructures-algorithms/images/\345\225\212\345\223\210!\347\256\227\346\263\225.png" "b/docs/dataStructures-algorithms/images/\345\225\212\345\223\210!\347\256\227\346\263\225.png"
deleted file mode 100644
index 5a7c48cbb88..00000000000
Binary files "a/docs/dataStructures-algorithms/images/\345\225\212\345\223\210!\347\256\227\346\263\225.png" and /dev/null differ
diff --git "a/docs/dataStructures-algorithms/images/\346\210\221\347\232\204\347\254\254\344\270\200\346\234\254\347\256\227\346\263\225\344\271\246.jpeg" "b/docs/dataStructures-algorithms/images/\346\210\221\347\232\204\347\254\254\344\270\200\346\234\254\347\256\227\346\263\225\344\271\246.jpeg"
deleted file mode 100644
index 221f53bc2ec..00000000000
Binary files "a/docs/dataStructures-algorithms/images/\346\210\221\347\232\204\347\254\254\344\270\200\346\234\254\347\256\227\346\263\225\344\271\246.jpeg" and /dev/null differ
diff --git "a/docs/dataStructures-algorithms/images/\347\250\213\345\272\217\345\221\230\344\273\243\347\240\201\351\235\242\350\257\225\346\214\207\345\215\227.jpeg" "b/docs/dataStructures-algorithms/images/\347\250\213\345\272\217\345\221\230\344\273\243\347\240\201\351\235\242\350\257\225\346\214\207\345\215\227.jpeg"
deleted file mode 100644
index 1f3e8eb8469..00000000000
Binary files "a/docs/dataStructures-algorithms/images/\347\250\213\345\272\217\345\221\230\344\273\243\347\240\201\351\235\242\350\257\225\346\214\207\345\215\227.jpeg" and /dev/null differ
diff --git "a/docs/dataStructures-algorithms/images/\347\256\227\346\263\225-4.jpeg" "b/docs/dataStructures-algorithms/images/\347\256\227\346\263\225-4.jpeg"
deleted file mode 100644
index 57af669b753..00000000000
Binary files "a/docs/dataStructures-algorithms/images/\347\256\227\346\263\225-4.jpeg" and /dev/null differ
diff --git "a/docs/dataStructures-algorithms/images/\347\256\227\346\263\225\345\233\276\350\247\243.jpeg" "b/docs/dataStructures-algorithms/images/\347\256\227\346\263\225\345\233\276\350\247\243.jpeg"
deleted file mode 100644
index f59c5ccf0c3..00000000000
Binary files "a/docs/dataStructures-algorithms/images/\347\256\227\346\263\225\345\233\276\350\247\243.jpeg" and /dev/null differ
diff --git "a/docs/dataStructures-algorithms/images/\347\256\227\346\263\225\345\257\274\350\256\272.jpeg" "b/docs/dataStructures-algorithms/images/\347\256\227\346\263\225\345\257\274\350\256\272.jpeg"
deleted file mode 100644
index f7b282be6aa..00000000000
Binary files "a/docs/dataStructures-algorithms/images/\347\256\227\346\263\225\345\257\274\350\256\272.jpeg" and /dev/null differ
diff --git "a/docs/dataStructures-algorithms/images/\347\256\227\346\263\225\350\256\276\350\256\241\346\211\213\345\206\214.png" "b/docs/dataStructures-algorithms/images/\347\256\227\346\263\225\350\256\276\350\256\241\346\211\213\345\206\214.png"
deleted file mode 100644
index ecf283346dc..00000000000
Binary files "a/docs/dataStructures-algorithms/images/\347\256\227\346\263\225\350\256\276\350\256\241\346\211\213\345\206\214.png" and /dev/null differ
diff --git "a/docs/dataStructures-algorithms/images/\347\274\226\347\250\213\344\271\213\347\276\216.jpeg" "b/docs/dataStructures-algorithms/images/\347\274\226\347\250\213\344\271\213\347\276\216.jpeg"
deleted file mode 100644
index fad8cc7ca7a..00000000000
Binary files "a/docs/dataStructures-algorithms/images/\347\274\226\347\250\213\344\271\213\347\276\216.jpeg" and /dev/null differ
diff --git "a/docs/dataStructures-algorithms/images/\347\274\226\347\250\213\347\217\240\347\216\221.jpeg" "b/docs/dataStructures-algorithms/images/\347\274\226\347\250\213\347\217\240\347\216\221.jpeg"
deleted file mode 100644
index 79dddcc90c6..00000000000
Binary files "a/docs/dataStructures-algorithms/images/\347\274\226\347\250\213\347\217\240\347\216\221.jpeg" and /dev/null differ
diff --git "a/docs/dataStructures-algorithms/images/\350\256\241\347\256\227\346\234\272\347\250\213\345\272\217\350\256\276\350\256\241\350\211\272\346\234\257.png" "b/docs/dataStructures-algorithms/images/\350\256\241\347\256\227\346\234\272\347\250\213\345\272\217\350\256\276\350\256\241\350\211\272\346\234\257.png"
deleted file mode 100644
index 0a86066d06d..00000000000
Binary files "a/docs/dataStructures-algorithms/images/\350\256\241\347\256\227\346\234\272\347\250\213\345\272\217\350\256\276\350\256\241\350\211\272\346\234\257.png" and /dev/null differ
diff --git "a/docs/dataStructures-algorithms/\347\256\227\346\263\225\345\255\246\344\271\240\350\265\204\346\272\220\346\216\250\350\215\220.md" "b/docs/dataStructures-algorithms/\347\256\227\346\263\225\345\255\246\344\271\240\350\265\204\346\272\220\346\216\250\350\215\220.md"
deleted file mode 100644
index 699ddf51404..00000000000
--- "a/docs/dataStructures-algorithms/\347\256\227\346\263\225\345\255\246\344\271\240\350\265\204\346\272\220\346\216\250\350\215\220.md"
+++ /dev/null
@@ -1,138 +0,0 @@
-先占个坑,说一下我觉得算法这部分学习比较好的规划:
-
-1. 未入门(对算法和基本数据结构不了解)之前建议先找一本入门书籍看;
-2. 如果时间比较多可以看一下我推荐的经典部分的书籍,《算法》这本书是首要要看的,其他推荐的神书看自己时间和心情就好,不要太纠结。
-3. 如果要准备面试,时间比较紧的话,就不需要再去看《算法》这本书了,时间来不及,当然你也可以选取其特定的章节查看。我也推荐了几本不错的专门为算法面试准备的书籍比如《剑指offer》和《程序员代码面试指南》。除了这两本书籍的话,我在下面推荐了 Leetcode 和牛客网这两个常用的刷题网站以及一些比较好的题目资源。
-
-## 书籍推荐
-
-> 以下提到的部分书籍的 PDF 高清阅读版本在我的公众号“JavaGuide”后台回复“书籍”即可获取。
-
-先来看三本入门书籍,这三本入门书籍中的任何一本拿来作为入门学习都非常好。我个人比较倾向于 **《我的第一本算法书》** 这本书籍,虽然它相比于其他两本书集它的豆瓣评分略低一点。我觉得它的配图以及讲解是这三本书中最优秀,唯一比较明显的问题就是没有代码示例。但是,我觉得这不影响它是一本好的算法书籍。因为本身下面这三本入门书籍的目的就不是通过代码来让你的算法有多厉害,只是作为一本很好的入门书籍让你进入算法学习的大门。
-
-### 入门
-
-
-
-**[我的第一本算法书](https://book.douban.com/subject/30357170/) (豆瓣评分 7.1,0.2K+人评价)**
-
-一本不那么“专业”的算法书籍。和下面两本推荐的算法书籍都是比较通俗易懂,“不那么深入”的算法书籍。我个人非常推荐,配图和讲解都非常不错!
-
-
-
-**[《算法图解》](https://book.douban.com/subject/26979890/)(豆瓣评分 8.4,1.5K+人评价)**
-
-入门类型的书籍,读起来比较浅显易懂,非常适合没有算法基础或者说算法没学好的小伙伴用来入门。示例丰富,图文并茂,以让人容易理解的方式阐释了算法.读起来比较快,内容不枯燥!
-
-
-
-**[啊哈!算法](https://book.douban.com/subject/25894685/) (豆瓣评分 7.7,0.5K+人评价)**
-
-和《算法图解》类似的算法趣味入门书籍。
-
-### 经典
-
-
-
-**[《算法 第四版》](https://book.douban.com/subject/10432347/)(豆瓣评分 9.3,0.4K+人评价)**
-
-我在大二的时候被我们的一个老师强烈安利过!自己也在当时购买了一本放在宿舍,到离开大学的时候自己大概看了一半多一点。因为内容实在太多了!另外,这本书还提供了详细的Java代码,非常适合学习 Java 的朋友来看,可以说是 Java 程序员的必备书籍之一了。
-
-再来介绍一下这本书籍吧!这本书籍算的上是算法领域经典的参考书,全面介绍了关于算法和数据结构的必备知识,并特别针对排序、搜索、图处理和字符串处理进行了论述。
-
-> **下面这些书籍都是经典中的经典,但是阅读起来难度也比较大,不做太多阐述,神书就完事了!推荐先看 《算法》,然后再选下面的书籍进行进一步阅读。不需要都看,找一本好好看或者找某本书的某一个章节知识点好好看。**
-
-
-
-**[编程珠玑](https://book.douban.com/subject/3227098/)(豆瓣评分 9.1,2K+人评价)**
-
-经典名著,被无数读者强烈推荐的书籍,几乎是顶级程序员必看的书籍之一了。这本书的作者也非常厉害,Java之父 James Gosling 就是他的学生。
-
-很多人都说这本书不是教你具体的算法,而是教你一种编程的思考方式。这种思考方式不仅仅在编程领域适用,在其他同样适用。
-
-
-
-**[《算法设计手册》](https://book.douban.com/subject/4048566/)(豆瓣评分9.1 , 45人评价)**
-
-被 [Teach Yourself Computer Science](https://teachyourselfcs.com/) 强烈推荐的一本算法书籍。
-
-
-
-**[《算法导论》](https://book.douban.com/subject/20432061/) (豆瓣评分 9.2,0.4K+人评价)**
-
-
-
-**[《计算机程序设计艺术(第1卷)》](https://book.douban.com/subject/1130500/)(豆瓣评分 9.4,0.4K+人评价)**
-
-### 面试
-
-
-
-**[《剑指Offer》](https://book.douban.com/subject/6966465/)(豆瓣评分 8.3,0.7K+人评价)**
-
-这本面试宝典上面涵盖了很多经典的算法面试题,如果你要准备大厂面试的话一定不要错过这本书。
-
-《剑指Offer》 对应的算法编程题部分的开源项目解析:[CodingInterviews](https://github.com/gatieme/CodingInterviews)
-
-
-
-
-
-
-
-**[程序员代码面试指南:IT名企算法与数据结构题目最优解(第2版)](https://book.douban.com/subject/30422021/) (豆瓣评分 8.7,0.2K+人评价)**
-
-题目相比于《剑指 offer》 来说要难很多,题目涵盖面相比于《剑指 offer》也更加全面。全书一共有将近300道真实出现过的经典代码面试题。
-
-
-
-
-
-**[编程之美](https://book.douban.com/subject/3004255/)(豆瓣评分 8.4,3K+人评价)**
-
-这本书收集了约60道算法和程序设计题目,这些题目大部分在近年的笔试、面试中出现过,或者是被微软员工热烈讨论过。作者试图从书中各种有趣的问题出发,引导读者发现问题,分析问题,解决问题,寻找更优的解法。
-
-## 网站推荐
-
-我比较推荐大家可以刷一下 Leetcode ,我自己平时没事也会刷一下,我觉得刷 Leetcode 不仅是为了能让你更从容地面对面试中的手撕算法问题,更可以提高你的编程思维能力、解决问题的能力以及你对某门编程语言 API 的熟练度。当然牛客网也有一些算法题,我下面也整理了一些。
-
-### [LeetCode](https://leetcode-cn.com/)
-
-[如何高效地使用 LeetCode](https://leetcode-cn.com/articles/%E5%A6%82%E4%BD%95%E9%AB%98%E6%95%88%E5%9C%B0%E4%BD%BF%E7%94%A8-leetcode/)
-
-- [《程序员代码面试指南》](https://leetcode-cn.com/problemset/lcci/)
-- [《剑指offer》](https://leetcode-cn.com/problemset/lcof/)
-
-
-### [牛客网](https://www.nowcoder.com)
-
-**[在线编程](https://www.nowcoder.com/activity/oj):**
-
-- [《剑指offer》](https://www.nowcoder.com/ta/coding-interviews)
-- [《程序员代码面试指南》](https://www.nowcoder.com/ta/programmer-code-interview-guide)
-- [2019 校招真题](https://www.nowcoder.com/ta/2019test)
-- [大一大二编程入门训练](https://www.nowcoder.com/ta/beginner-programmers)
-- .......
-
-**[大厂编程面试真题](https://www.nowcoder.com/contestRoom?filter=0&orderByHotValue=3&target=content&categories=-1&mutiTagIds=2491&page=1)**
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/database/MySQL.md b/docs/database/MySQL.md
index ed841e8701a..efd1561a08a 100644
--- a/docs/database/MySQL.md
+++ b/docs/database/MySQL.md
@@ -159,9 +159,9 @@ select sql_no_cache count(*) from usr;
事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。
-### 事物的四大特性(ACID)
+### 事务的四大特性(ACID)
-
+
1. **原子性(Atomicity):** 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
2. **一致性(Consistency):** 执行事务后,数据库从一个正确的状态变化到另一个正确的状态;
diff --git a/docs/database/Redis/some-concepts-of-caching.md b/docs/database/Redis/some-concepts-of-caching.md
index cda83d2b829..fb5730f527f 100644
--- a/docs/database/Redis/some-concepts-of-caching.md
+++ b/docs/database/Redis/some-concepts-of-caching.md
@@ -30,7 +30,7 @@
### 2. 使用缓存为系统带来了什么问题
-**软件系统设计中没有银弹,往往任何技术的引入都像是把双刃剑。** 但是,你使用好了之后,这把剑就是好剑。
+**软件系统设计中没有银弹,往往任何技术的引入都像是把双刃剑。** 你使用的方式得当,就能为系统带来很大的收益。否则,只是费了精力不讨好。
简单来说,为系统引入缓存之后往往会带来下面这些问题:
@@ -51,17 +51,13 @@ _那本地缓存的方案有哪些呢?且听 Guide 给你来说一说。_
**一:JDK 自带的 `HashMap` 和 `ConcurrentHashMap` 了。**
-`ConcurrentHashMap` 可以看作是线程安全版本的 `HashMap` ,两者都是存放 key/value 形式的键值对。但是,大部分场景来说不会使用这两者当做缓存,因为只提供了缓存的功能,并没有提供其他诸如过期时间之类的功能。一个稍微完善一点的缓存框架至少要提供:过期时间、淘汰机制、命中率统计这三点。
+`ConcurrentHashMap` 可以看作是线程安全版本的 `HashMap` ,两者都是存放 key/value 形式的键值对。但是,大部分场景来说不会使用这两者当做缓存,因为只提供了缓存的功能,并没有提供其他诸如过期时间之类的功能。一个稍微完善一点的缓存框架至少要提供:**过期时间**、**淘汰机制**、**命中率统计**这三点。
**二: `Ehcache` 、 `Guava Cache` 、 `Spring Cache` 这三者是使用的比较多的本地缓存框架。**
-`Ehcache` 的话相比于其他两者更加重量。不过,相比于 `Guava Cache` 、 `Spring Cache` 来说, `Ehcache` 支持可以嵌入到 hibernate 和 mybatis 作为多级缓存,并且可以将缓存的数据持久化到本地磁盘中、同时也提供了集群方案(比较鸡肋,可忽略)。
-
-`Guava Cache` 和 `Spring Cache` 两者的话比较像。
-
-`Guava` 相比于 `Spring Cache` 的话使用的更多一点,它提供了 API 非常方便我们使用,同时也提供了设置缓存有效时间等功能。它的内部实现也比较干净,很多地方都和 `ConcurrentHashMap` 的思想有异曲同工之妙。
-
-使用 `Spring Cache` 的注解实现缓存的话,代码会看着很干净和优雅,但是很容易出现问题比如缓存穿透、内存溢出。
+- `Ehcache` 的话相比于其他两者更加重量。不过,相比于 `Guava Cache` 、 `Spring Cache` 来说, `Ehcache` 支持可以嵌入到 hibernate 和 mybatis 作为多级缓存,并且可以将缓存的数据持久化到本地磁盘中、同时也提供了集群方案(比较鸡肋,可忽略)。
+- `Guava Cache` 和 `Spring Cache` 两者的话比较像。`Guava` 相比于 `Spring Cache` 的话使用的更多一点,它提供了 API 非常方便我们使用,同时也提供了设置缓存有效时间等功能。它的内部实现也比较干净,很多地方都和 `ConcurrentHashMap` 的思想有异曲同工之妙。
+- 使用 `Spring Cache` 的注解实现缓存的话,代码会看着很干净和优雅,但是很容易出现问题比如缓存穿透、内存溢出。
**三: 后起之秀 Caffeine。**
@@ -69,22 +65,22 @@ _那本地缓存的方案有哪些呢?且听 Guide 给你来说一说。_
本地缓存固然好,但是缺陷也很明显,比如多个相同服务之间的本地缓存的数据无法共享。
-_下面我们从为什么要有分布式缓存为接入点来正式进入 Redis 的相关问题总结。_
-
### 4. 为什么要有分布式缓存?/为什么不直接用本地缓存?
-_我们可以把分布式缓存(Distributed Cache) 看作是一种内存数据库的服务,它的最终作用就是提供缓存数据的服务。_
+本地的缓存的优势非常明显:**低依赖**、**轻量**、**简单**、**成本低**。
-如下图所示,就是一个简单的使用分布式缓存的架构图。我们使用 Nginx 来做负载均衡,部署两个相同的服务到服务器,两个服务使用同一个数据库和缓存。
+但是,本地缓存
-
+1. **本地缓存对分布式架构支持不友好**,比如同一个相同的服务部署在多台机器上的时候,各个服务之间的缓存是无法共享的,因为本地缓存只在当前机器上有。
+2. **本地缓存容量受服务部署所在的机器限制明显。** 如果当前系统服务所耗费的内存多,那么本地缓存可用的容量就很少。
-本地的缓存的优势是低依赖,比较轻量并且通常相比于使用分布式缓存要更加简单。
+**我们可以把分布式缓存(Distributed Cache) 看作是一种内存数据库的服务,它的最终作用就是提供缓存数据的服务。**
-再来分析一下本地缓存的局限性:
+如下图所示,就是一个简单的使用分布式缓存的架构图。我们使用 Nginx 来做负载均衡,部署两个相同的服务到服务器,两个服务使用同一个数据库和缓存。
-1. **本地缓存对分布式架构支持不友好**,比如同一个相同的服务部署在多台机器上的时候,各个服务之间的缓存是无法共享的,因为本地缓存只在当前机器上有。
-2. **本地缓存容量受服务部署所在的机器限制明显。** 如果当前系统服务所耗费的内存多,那么本地缓存可用的容量就很少。
+
+
+2.
使用分布式缓存之后,缓存部署在一台单独的服务器上,即使同一个相同的服务部署在再多机器上,也是使用的同一份缓存。 并且,单独的分布式缓存服务的性能、容量和提供的功能都要更加强大。
diff --git "a/docs/java/basis/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" "b/docs/java/basis/Java\345\237\272\347\241\200\347\237\245\350\257\206.md"
index 7d7568f7350..34d110a09a4 100644
--- "a/docs/java/basis/Java\345\237\272\347\241\200\347\237\245\350\257\206.md"
+++ "b/docs/java/basis/Java\345\237\272\347\241\200\347\237\245\350\257\206.md"
@@ -1,95 +1,93 @@
-点击关注[公众号](#公众号)及时获取笔主最新更新文章,并可免费领取本文档配套的《Java 面试突击》以及 Java 工程师必备学习资源。
+
-
+
- [1. Java 基本功](#1-java-基本功)
- - [1.1. Java 入门(基础概念与常识)](#11-java-入门基础概念与常识)
- - [1.1.1. Java 语言有哪些特点?](#111-java-语言有哪些特点)
- - [1.1.2. 关于 JVM JDK 和 JRE 最详细通俗的解答](#112-关于-jvm-jdk-和-jre-最详细通俗的解答)
- - [1.1.2.1. JVM](#1121-jvm)
- - [1.1.2.2. JDK 和 JRE](#1122-jdk-和-jre)
- - [1.1.3. Oracle JDK 和 OpenJDK 的对比](#113-oracle-jdk-和-openjdk-的对比)
- - [1.1.4. Java 和 C++的区别?](#114-java-和-c的区别)
- - [1.1.5. 什么是 Java 程序的主类 应用程序和小程序的主类有何不同?](#115-什么是-java-程序的主类-应用程序和小程序的主类有何不同)
- - [1.1.6. import java 和 javax 有什么区别?](#116-import-java-和-javax-有什么区别)
- - [1.1.7. 为什么说 Java 语言“编译与解释并存”?](#117-为什么说-java-语言编译与解释并存)
- - [1.2. Java 语法](#12-java-语法)
- - [1.2.1. 字符型常量和字符串常量的区别?](#121-字符型常量和字符串常量的区别)
- - [1.2.2. 关于注释?](#122-关于注释)
- - [1.2.3. 标识符和关键字的区别是什么?](#123-标识符和关键字的区别是什么)
- - [1.2.4. Java中有哪些常见的关键字?](#124-java中有哪些常见的关键字)
- - [1.2.5. 自增自减运算符](#125-自增自减运算符)
- - [1.2.6. continue、break、和return的区别是什么?](#126-continuebreak和return的区别是什么)
- - [1.2.7. Java泛型了解么?什么是类型擦除?介绍一下常用的通配符?](#127-java泛型了解么什么是类型擦除介绍一下常用的通配符)
- - [1.2.8. ==和equals的区别](#128-和equals的区别)
- - [1.2.9. hashCode()与 equals()](#129-hashcode与-equals)
- - [1.3. 基本数据类型](#13-基本数据类型)
- - [1.3.1. Java中的几种基本数据类型是什么?对应的包装类型是什么?各自占用多少字节呢?](#131-java中的几种基本数据类型是什么对应的包装类型是什么各自占用多少字节呢)
- - [1.3.2. 自动装箱与拆箱](#132-自动装箱与拆箱)
- - [1.3.3. 8种基本类型的包装类和常量池](#133-8种基本类型的包装类和常量池)
- - [1.4. 方法(函数)](#14-方法函数)
- - [1.4.1. 什么是方法的返回值?返回值在类的方法里的作用是什么?](#141-什么是方法的返回值返回值在类的方法里的作用是什么)
- - [1.4.2. 为什么 Java 中只有值传递?](#142-为什么-java-中只有值传递)
- - [1.4.3. 重载和重写的区别](#143-重载和重写的区别)
- - [1.4.3.1. 重载](#1431-重载)
- - [1.4.3.2. 重写](#1432-重写)
- - [1.4.4. 深拷贝 vs 浅拷贝](#144-深拷贝-vs-浅拷贝)
- - [1.4.5. 方法的四种类型](#145-方法的四种类型)
+ - [1.1. Java 入门(基础概念与常识)](#11-java-入门基础概念与常识)
+ - [1.1.1. Java 语言有哪些特点?](#111-java-语言有哪些特点)
+ - [1.1.2. 关于 JVM JDK 和 JRE 最详细通俗的解答](#112-关于-jvm-jdk-和-jre-最详细通俗的解答)
+ - [1.1.2.1. JVM](#1121-jvm)
+ - [1.1.2.2. JDK 和 JRE](#1122-jdk-和-jre)
+ - [1.1.3. Oracle JDK 和 OpenJDK 的对比](#113-oracle-jdk-和-openjdk-的对比)
+ - [1.1.4. Java 和 C++的区别?](#114-java-和-c的区别)
+ - [1.1.5. 什么是 Java 程序的主类 应用程序和小程序的主类有何不同?](#115-什么是-java-程序的主类-应用程序和小程序的主类有何不同)
+ - [1.1.6. import java 和 javax 有什么区别?](#116-import-java-和-javax-有什么区别)
+ - [1.1.7. 为什么说 Java 语言“编译与解释并存”?](#117-为什么说-java-语言编译与解释并存)
+ - [1.2. Java 语法](#12-java-语法)
+ - [1.2.1. 字符型常量和字符串常量的区别?](#121-字符型常量和字符串常量的区别)
+ - [1.2.2. 关于注释?](#122-关于注释)
+ - [1.2.3. 标识符和关键字的区别是什么?](#123-标识符和关键字的区别是什么)
+ - [1.2.4. Java中有哪些常见的关键字?](#124-java中有哪些常见的关键字)
+ - [1.2.5. 自增自减运算符](#125-自增自减运算符)
+ - [1.2.6. continue、break、和return的区别是什么?](#126-continue-break-和return的区别是什么)
+ - [1.2.7. Java泛型了解么?什么是类型擦除?介绍一下常用的通配符?](#127-java泛型了解么什么是类型擦除介绍一下常用的通配符)
+ - [1.2.8. ==和equals的区别](#128-和equals的区别)
+ - [1.2.9. hashCode()与 equals()](#129-hashcode与-equals)
+ - [1.3. 基本数据类型](#13-基本数据类型)
+ - [1.3.1. Java中的几种基本数据类型是什么?对应的包装类型是什么?各自占用多少字节呢?](#131-java中的几种基本数据类型是什么对应的包装类型是什么各自占用多少字节呢)
+ - [1.3.2. 自动装箱与拆箱](#132-自动装箱与拆箱)
+ - [1.3.3. 8种基本类型的包装类和常量池](#133-8种基本类型的包装类和常量池)
+ - [1.4. 方法(函数)](#14-方法函数)
+ - [1.4.1. 什么是方法的返回值?返回值在类的方法里的作用是什么?](#141-什么是方法的返回值返回值在类的方法里的作用是什么)
+ - [1.4.2. 为什么 Java 中只有值传递?](#142-为什么-java-中只有值传递)
+ - [1.4.3. 重载和重写的区别](#143-重载和重写的区别)
+ - [1.4.4. 深拷贝 vs 浅拷贝](#144-深拷贝-vs-浅拷贝)
+ - [1.4.5. 方法的四种类型](#145-方法的四种类型)
- [2. Java 面向对象](#2-java-面向对象)
- - [2.1. 类和对象](#21-类和对象)
- - [2.1.1. 面向对象和面向过程的区别](#211-面向对象和面向过程的区别)
- - [2.1.2. 构造器 Constructor 是否可被 override?](#212-构造器-constructor-是否可被-override)
- - [2.1.3. 在 Java 中定义一个不做事且没有参数的构造方法的作用](#213-在-java-中定义一个不做事且没有参数的构造方法的作用)
- - [2.1.4. 成员变量与局部变量的区别有哪些?](#214-成员变量与局部变量的区别有哪些)
- - [2.1.5. 创建一个对象用什么运算符?对象实体与对象引用有何不同?](#215-创建一个对象用什么运算符对象实体与对象引用有何不同)
- - [2.1.6. 一个类的构造方法的作用是什么? 若一个类没有声明构造方法,该程序能正确执行吗? 为什么?](#216-一个类的构造方法的作用是什么-若一个类没有声明构造方法该程序能正确执行吗-为什么)
- - [2.1.7. 构造方法有哪些特性?](#217-构造方法有哪些特性)
- - [2.1.8. 在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?](#218-在调用子类构造方法之前会先调用父类没有参数的构造方法其目的是)
- - [2.1.9. 对象的相等与指向他们的引用相等,两者有什么不同?](#219-对象的相等与指向他们的引用相等两者有什么不同)
- - [2.2. 面向对象三大特征](#22-面向对象三大特征)
- - [2.2.1. 封装](#221-封装)
- - [2.2.2. 继承](#222-继承)
- - [2.2.3. 多态](#223-多态)
- - [2.3. 修饰符](#23-修饰符)
- - [2.3.1. 在一个静态方法内调用一个非静态成员为什么是非法的?](#231-在一个静态方法内调用一个非静态成员为什么是非法的)
- - [2.3.2. 静态方法和实例方法有何不同](#232-静态方法和实例方法有何不同)
- - [2.3.3. 常见关键字总结:static,final,this,super](#233-常见关键字总结staticfinalthissuper)
- - [2.4. 接口和抽象类](#24-接口和抽象类)
- - [2.4.1. 接口和抽象类的区别是什么?](#241-接口和抽象类的区别是什么)
- - [2.5. 其它重要知识点](#25-其它重要知识点)
- - [2.5.1. String StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?](#251-string-stringbuffer-和-stringbuilder-的区别是什么-string-为什么是不可变的)
- - [2.5.2. Object 类的常见方法总结](#252-object-类的常见方法总结)
- - [2.5.3. == 与 equals(重要)](#253--与-equals重要)
- - [2.5.4. hashCode 与 equals (重要)](#254-hashcode-与-equals-重要)
- - [2.5.4.1. hashCode()介绍](#2541-hashcode介绍)
- - [2.5.4.2. 为什么要有 hashCode](#2542-为什么要有-hashcode)
- - [2.5.4.3. hashCode()与 equals()的相关规定](#2543-hashcode与-equals的相关规定)
- - [2.5.5. Java 序列化中如果有些字段不想进行序列化,怎么办?](#255-java-序列化中如果有些字段不想进行序列化怎么办)
- - [2.5.6. 获取用键盘输入常用的两种方法](#256-获取用键盘输入常用的两种方法)
+ - [2.1. 类和对象](#21-类和对象)
+ - [2.1.1. 面向对象和面向过程的区别](#211-面向对象和面向过程的区别)
+ - [2.1.2. 构造器 Constructor 是否可被 override?](#212-构造器-constructor-是否可被-override)
+ - [2.1.3. 在 Java 中定义一个不做事且没有参数的构造方法的作用](#213-在-java-中定义一个不做事且没有参数的构造方法的作用)
+ - [2.1.4. 成员变量与局部变量的区别有哪些?](#214-成员变量与局部变量的区别有哪些)
+ - [2.1.5. 创建一个对象用什么运算符?对象实体与对象引用有何不同?](#215-创建一个对象用什么运算符对象实体与对象引用有何不同)
+ - [2.1.6. 一个类的构造方法的作用是什么? 若一个类没有声明构造方法,该程序能正确执行吗? 为什么?](#216-一个类的构造方法的作用是什么-若一个类没有声明构造方法该程序能正确执行吗-为什么)
+ - [2.1.7. 构造方法有哪些特性?](#217-构造方法有哪些特性)
+ - [2.1.8. 在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?](#218-在调用子类构造方法之前会先调用父类没有参数的构造方法其目的是)
+ - [2.1.9. 对象的相等与指向他们的引用相等,两者有什么不同?](#219-对象的相等与指向他们的引用相等两者有什么不同)
+ - [2.2. 面向对象三大特征](#22-面向对象三大特征)
+ - [2.2.1. 封装](#221-封装)
+ - [2.2.2. 继承](#222-继承)
+ - [2.2.3. 多态](#223-多态)
+ - [2.3. 修饰符](#23-修饰符)
+ - [2.3.1. 在一个静态方法内调用一个非静态成员为什么是非法的?](#231-在一个静态方法内调用一个非静态成员为什么是非法的)
+ - [2.3.2. 静态方法和实例方法有何不同](#232-静态方法和实例方法有何不同)
+ - [2.3.3. 常见关键字总结:static,final,this,super](#233-常见关键字总结staticfinalthissuper)
+ - [2.4. 接口和抽象类](#24-接口和抽象类)
+ - [2.4.1. 接口和抽象类的区别是什么?](#241-接口和抽象类的区别是什么)
+ - [2.5. 其它重要知识点](#25-其它重要知识点)
+ - [2.5.1. String StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?](#251-string-stringbuffer-和-stringbuilder-的区别是什么-string-为什么是不可变的)
+ - [2.5.2. Object 类的常见方法总结](#252-object-类的常见方法总结)
+ - [2.5.3. == 与 equals(重要)](#253-与-equals重要)
+ - [2.5.4. hashCode 与 equals (重要)](#254-hashcode-与-equals-重要)
+ - [2.5.4.1. hashCode()介绍](#2541-hashcode介绍)
+ - [2.5.4.2. 为什么要有 hashCode](#2542-为什么要有-hashcode)
+ - [2.5.4.3. hashCode()与 equals()的相关规定](#2543-hashcode与-equals的相关规定)
+ - [2.5.5. Java 序列化中如果有些字段不想进行序列化,怎么办?](#255-java-序列化中如果有些字段不想进行序列化怎么办)
+ - [2.5.6. 获取用键盘输入常用的两种方法](#256-获取用键盘输入常用的两种方法)
- [3. Java 核心技术](#3-java-核心技术)
- - [3.1. 反射机制](#31-反射机制)
- - [3.1.1. 静态编译和动态编译](#311静态编译和动态编译)
- - [3.1.2. 反射机制优缺点](#312反射机制优缺点)
- - [3.1.3. 反射的应用场景](#313反射的应用场景)
-
- - [3.2. 异常](#32-异常)
- - [3.2.1. Java 异常类层次结构图](#321-java-异常类层次结构图)
- - [3.2.2. Throwable 类常用方法](#322-throwable-类常用方法)
- - [3.2.3. try-catch-finally](#323-try-catch-finally)
- - [3.2.4. 使用 `try-with-resources` 来代替`try-catch-finally`](#324-使用-try-with-resources-来代替try-catch-finally)
- - [3.3. 多线程](#33-多线程)
- - [3.3.1. 简述线程、程序、进程的基本概念。以及他们之间关系是什么?](#331-简述线程程序进程的基本概念以及他们之间关系是什么)
- - [3.3.2. 线程有哪些基本状态?](#332-线程有哪些基本状态)
- - [3.4. 文件与 I\O 流](#34-文件与-io-流)
- - [3.4.1. Java 中 IO 流分为几种?](#341-java-中-io-流分为几种)
- - [3.4.1.1. 既然有了字节流,为什么还要有字符流?](#3411-既然有了字节流为什么还要有字符流)
- - [3.4.1.2. BIO,NIO,AIO 有什么区别?](#3412-bionioaio-有什么区别)
+ - [3.1. 反射机制](#31-反射机制)
+ - [3.1.1.静态编译和动态编译](#311静态编译和动态编译)
+ - [3.1.2.反射机制优缺点](#312反射机制优缺点)
+ - [3.1.3.反射的应用场景](#313反射的应用场景)
+ - [3.2. 异常](#32-异常)
+ - [3.2.1. Java 异常类层次结构图](#321-java-异常类层次结构图)
+ - [3.2.2. Throwable 类常用方法](#322-throwable-类常用方法)
+ - [3.2.3. try-catch-finally](#323-try-catch-finally)
+ - [3.2.4. 使用 `try-with-resources` 来代替`try-catch-finally`](#324-使用-try-with-resources-来代替try-catch-finally)
+ - [3.3. 多线程](#33-多线程)
+ - [3.3.1. 简述线程、程序、进程的基本概念。以及他们之间关系是什么?](#331-简述线程-程序-进程的基本概念以及他们之间关系是什么)
+ - [3.3.2. 线程有哪些基本状态?](#332-线程有哪些基本状态)
+ - [3.4. 文件与 I\O 流](#34-文件与-io-流)
+ - [3.4.1. Java 中 IO 流分为几种?](#341-java-中-io-流分为几种)
+ - [3.4.1.1. 既然有了字节流,为什么还要有字符流?](#3411-既然有了字节流为什么还要有字符流)
+ - [3.4.1.2. BIO,NIO,AIO 有什么区别?](#3412-bionioaio-有什么区别)
- [4. 参考](#4-参考)
-- [5. 公众号](#5-公众号)
-
+
+
+
## 1. Java 基本功
@@ -1394,12 +1392,3 @@ Java Io 流共涉及 40 多个类,这些类看上去很杂乱,但实际上
- https://www.educba.com/oracle-vs-openjdk/
- https://stackoverflow.com/questions/22358071/differences-between-oracle-jdk-and-openjdk?answertab=active#tab-top
-## 5. 公众号
-
-如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号。
-
-**《Java 面试突击》:** 由本文档衍生的专为面试而生的《Java 面试突击》V2.0 PDF 版本[公众号](#公众号)后台回复 **"Java 面试突击"** 即可免费领取!
-
-**Java 工程师必备学习资源:** 一些 Java 工程师常用学习资源公众号后台回复关键字 **“1”** 即可免费无套路获取。
-
-
diff --git "a/docs/java/basis/Java\345\237\272\347\241\200\347\237\245\350\257\206\347\226\221\351\232\276\347\202\271.md" "b/docs/java/basis/Java\345\237\272\347\241\200\347\237\245\350\257\206\347\226\221\351\232\276\347\202\271.md"
index 41199449340..fc669f19b1d 100644
--- "a/docs/java/basis/Java\345\237\272\347\241\200\347\237\245\350\257\206\347\226\221\351\232\276\347\202\271.md"
+++ "b/docs/java/basis/Java\345\237\272\347\241\200\347\237\245\350\257\206\347\226\221\351\232\276\347\202\271.md"
@@ -1,23 +1,23 @@
-- [1. 基础](#_1-基础)
- - [1.1. 正确使用 equals 方法](#_11-正确使用-equals-方法)
- - [1.2. 整型包装类值的比较](#_12-整型包装类值的比较)
- - [1.3. BigDecimal](#_13-bigdecimal)
- - [1.3.1. BigDecimal 的用处](#_131-bigdecimal-的用处)
- - [1.3.2. BigDecimal 的大小比较](#_132-bigdecimal-的大小比较)
- - [1.3.3. BigDecimal 保留几位小数](#_133-bigdecimal-保留几位小数)
- - [1.3.4. BigDecimal 的使用注意事项](#_134-bigdecimal-的使用注意事项)
- - [1.3.5. 总结](#_135-总结)
- - [1.4. 基本数据类型与包装数据类型的使用标准](#_14-基本数据类型与包装数据类型的使用标准)
+- [1. 基础](#1-基础)
+ - [1.1. 正确使用 equals 方法](#11-正确使用-equals-方法)
+ - [1.2. 整型包装类值的比较](#12-整型包装类值的比较)
+ - [1.3. BigDecimal](#13-bigdecimal)
+ - [1.3.1. BigDecimal 的用处](#131-bigdecimal-的用处)
+ - [1.3.2. BigDecimal 的大小比较](#132-bigdecimal-的大小比较)
+ - [1.3.3. BigDecimal 保留几位小数](#133-bigdecimal-保留几位小数)
+ - [1.3.4. BigDecimal 的使用注意事项](#134-bigdecimal-的使用注意事项)
+ - [1.3.5. 总结](#135-总结)
+ - [1.4. 基本数据类型与包装数据类型的使用标准](#14-基本数据类型与包装数据类型的使用标准)
- [2. 集合](#_2-集合)
- - [2.1. Arrays.asList()使用指南](#_21-arraysaslist使用指南)
- - [2.1.1. 简介](#_211-简介)
- - [2.1.2. 《阿里巴巴Java 开发手册》对其的描述](#_212-阿里巴巴java-开发手册对其的描述)
- - [2.1.3. 使用时的注意事项总结](#_213-使用时的注意事项总结)
- - [2.1.4. 如何正确的将数组转换为ArrayList?](#_214-如何正确的将数组转换为arraylist)
- - [2.2. Collection.toArray()方法使用的坑&如何反转数组](#_22-collectiontoarray方法使用的坑如何反转数组)
- - [2.3. 不要在 foreach 循环里进行元素的 remove/add 操作](#_23-不要在-foreach-循环里进行元素的-removeadd-操作)
+ - [2.1. Arrays.asList()使用指南](#21-arraysaslist使用指南)
+ - [2.1.1. 简介](#211-简介)
+ - [2.1.2. 《阿里巴巴Java 开发手册》对其的描述](#212-阿里巴巴java-开发手册对其的描述)
+ - [2.1.3. 使用时的注意事项总结](#213-使用时的注意事项总结)
+ - [2.1.4. 如何正确的将数组转换为ArrayList?](#214-如何正确的将数组转换为arraylist)
+ - [2.2. Collection.toArray()方法使用的坑&如何反转数组](#22-collectiontoarray方法使用的坑如何反转数组)
+ - [2.3. 不要在 foreach 循环里进行元素的 remove/add 操作](#23-不要在-foreach-循环里进行元素的-removeadd-操作)
@@ -83,7 +83,7 @@ System.out.println(a.equals(b));//true
当使用自动装箱方式创建一个Integer对象时,当数值在-128 ~127时,会将创建的 Integer 对象缓存起来,当下次再出现该数值时,直接从缓存中取出对应的Integer对象。所以上述代码中,x和y引用的是相同的Integer对象。
-**注意:**如果你的IDE(IDEA/Eclipse)上安装了阿里巴巴的p3c插件,这个插件如果检测到你用 ==的话会报错提示,推荐安装一个这个插件,很不错。
+**注意:** 如果你的IDE(IDEA/Eclipse)上安装了阿里巴巴的p3c插件,这个插件如果检测到你用 ==的话会报错提示,推荐安装一个这个插件,很不错。
## 1.3. BigDecimal
diff --git "a/docs/java/basis/Java\345\270\270\350\247\201\345\205\263\351\224\256\345\255\227\346\200\273\347\273\223:final,static,this,super.md" "b/docs/java/basis/Java\345\270\270\350\247\201\345\205\263\351\224\256\345\255\227\346\200\273\347\273\223.md"
similarity index 100%
rename from "docs/java/basis/Java\345\270\270\350\247\201\345\205\263\351\224\256\345\255\227\346\200\273\347\273\223:final,static,this,super.md"
rename to "docs/java/basis/Java\345\270\270\350\247\201\345\205\263\351\224\256\345\255\227\346\200\273\347\273\223.md"
diff --git "a/docs/java/images/Java\345\274\202\345\270\270\347\261\273\345\261\202\346\254\241\347\273\223\346\236\204\345\233\276.png" "b/docs/java/basis/images/Java\345\274\202\345\270\270\347\261\273\345\261\202\346\254\241\347\273\223\346\236\204\345\233\276.png"
similarity index 100%
rename from "docs/java/images/Java\345\274\202\345\270\270\347\261\273\345\261\202\346\254\241\347\273\223\346\236\204\345\233\276.png"
rename to "docs/java/basis/images/Java\345\274\202\345\270\270\347\261\273\345\261\202\346\254\241\347\273\223\346\236\204\345\233\276.png"
diff --git "a/docs/java/images/Java\345\274\202\345\270\270\347\261\273\345\261\202\346\254\241\347\273\223\346\236\204\345\233\2762.png" "b/docs/java/basis/images/Java\345\274\202\345\270\270\347\261\273\345\261\202\346\254\241\347\273\223\346\236\204\345\233\2762.png"
similarity index 100%
rename from "docs/java/images/Java\345\274\202\345\270\270\347\261\273\345\261\202\346\254\241\347\273\223\346\236\204\345\233\2762.png"
rename to "docs/java/basis/images/Java\345\274\202\345\270\270\347\261\273\345\261\202\346\254\241\347\273\223\346\236\204\345\233\2762.png"
diff --git "a/docs/java/basis/\351\235\231\346\200\201\344\273\243\347\220\206+JDK,CGLIB\345\212\250\346\200\201\344\273\243\347\220\206\345\256\236\346\210\230.md" "b/docs/java/basis/\344\273\243\347\220\206\346\250\241\345\274\217\350\257\246\350\247\243.md"
similarity index 100%
rename from "docs/java/basis/\351\235\231\346\200\201\344\273\243\347\220\206+JDK,CGLIB\345\212\250\346\200\201\344\273\243\347\220\206\345\256\236\346\210\230.md"
rename to "docs/java/basis/\344\273\243\347\220\206\346\250\241\345\274\217\350\257\246\350\247\243.md"
diff --git "a/docs/java/basis/\344\273\200\344\271\210\346\230\257\345\217\215\345\260\204\346\234\272\345\210\266?\345\217\215\345\260\204\346\234\272\345\210\266\347\232\204\345\272\224\347\224\250\345\234\272\346\231\257\346\234\211\345\223\252\344\272\233?.md" "b/docs/java/basis/\345\217\215\345\260\204\346\234\272\345\210\266.md"
similarity index 100%
rename from "docs/java/basis/\344\273\200\344\271\210\346\230\257\345\217\215\345\260\204\346\234\272\345\210\266?\345\217\215\345\260\204\346\234\272\345\210\266\347\232\204\345\272\224\347\224\250\345\234\272\346\231\257\346\234\211\345\223\252\344\272\233?.md"
rename to "docs/java/basis/\345\217\215\345\260\204\346\234\272\345\210\266.md"
diff --git "a/docs/java/jvm/JVM\345\236\203\345\234\276\345\233\236\346\224\266.md" "b/docs/java/jvm/JVM\345\236\203\345\234\276\345\233\236\346\224\266.md"
index f6ede78512e..e9d219c1a3d 100644
--- "a/docs/java/jvm/JVM\345\236\203\345\234\276\345\233\236\346\224\266.md"
+++ "b/docs/java/jvm/JVM\345\236\203\345\234\276\345\233\236\346\224\266.md"
@@ -300,7 +300,15 @@ JDK1.2 以后,Java 对引用的概念进行了扩充,将引用分为强引
运行时常量池主要回收的是废弃的常量。那么,我们如何判断一个常量是废弃常量呢?
-假如在常量池中存在字符串 "abc",如果当前没有任何 String 对象引用该字符串常量的话,就说明常量 "abc" 就是废弃常量,如果这时发生内存回收的话而且有必要的话,"abc" 就会被系统清理出常量池。
+~~**JDK1.7 及之后版本的 JVM 已经将运行时常量池从方法区中移了出来,在 Java 堆(Heap)中开辟了一块区域存放运行时常量池。**~~
+
+> 修正([issue747](https://github.com/Snailclimb/JavaGuide/issues/747),[reference](https://blog.csdn.net/q5706503/article/details/84640762)):
+>
+> 1. **JDK1.7之前运行时常量池逻辑包含字符串常量池存放在方法区, 此时hotspot虚拟机对方法区的实现为永久代**
+> 2. **JDK1.7 字符串常量池被从方法区拿到了堆中, 这里没有提到运行时常量池,也就是说字符串常量池被单独拿到堆,运行时常量池剩下的东西还在方法区, 也就是hotspot中的永久代** 。
+> 3. **JDK1.8 hotspot移除了永久代用元空间(Metaspace)取而代之, 这时候字符串常量池还在堆, 运行时常量池还在方法区, 只不过方法区的实现从永久代变成了元空间(Metaspace)**
+
+假如在字符串常量池中存在字符串 "abc",如果当前没有任何 String 对象引用该字符串常量的话,就说明常量 "abc" 就是废弃常量,如果这时发生内存回收的话而且有必要的话,"abc" 就会被系统清理出常量池了。
### 2.6 如何判断一个类是无用的类
@@ -309,8 +317,8 @@ JDK1.2 以后,Java 对引用的概念进行了扩充,将引用分为强引
判定一个常量是否是“废弃常量”比较简单,而要判定一个类是否是“无用的类”的条件则相对苛刻许多。类需要同时满足下面 3 个条件才能算是 **“无用的类”** :
- 该类所有的实例都已经被回收,也就是 Java 堆中不存在该类的任何实例。
-- 加载该类的 ClassLoader 已经被回收。
-- 该类对应的 java.lang.Class 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
+- 加载该类的 `ClassLoader` 已经被回收。
+- 该类对应的 `java.lang.Class` 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
虚拟机可以对满足上述 3 个条件的无用类进行回收,这里说的仅仅是“可以”,而并不是和对象一样不使用了就会必然被回收。
diff --git "a/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" "b/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md"
index 42dc7b7cb8d..01e4984312e 100644
--- "a/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md"
+++ "b/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md"
@@ -304,14 +304,14 @@ JDK1.4 中新加入的 **NIO(New Input/Output) 类**,引入了一种基于**
### 3.3 对象的访问定位
建立对象就是为了使用对象,我们的 Java 程序通过栈上的 reference 数据来操作堆上的具体对象。对象的访问方式由虚拟机实现而定,目前主流的访问方式有**①使用句柄**和**②直接指针**两种:
-1. **句柄:** 如果使用句柄的话,那么 Java 堆中将会划分出一块内存来作为句柄池,reference 中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息;
-
- 
+1. **句柄:** 如果使用句柄的话,那么 Java 堆中将会划分出一块内存来作为句柄池,reference 中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息; 
2. **直接指针:** 如果使用直接指针访问,那么 Java 堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,而 reference 中存储的直接就是对象的地址。

+
+
**这两种对象访问方式各有优势。使用句柄来访问的最大好处是 reference 中存储的是稳定的句柄地址,在对象被移动时只会改变句柄中的实例数据指针,而 reference 本身不需要修改。使用直接指针访问方式最大的好处就是速度快,它节省了一次指针定位的时间开销。**
diff --git "a/docs/java/jvm/pictures/java\345\206\205\345\255\230\345\214\272\345\237\237/\345\257\271\350\261\241\347\232\204\350\256\277\351\227\256\345\256\232\344\275\215-\344\275\277\347\224\250\345\217\245\346\237\204.png" "b/docs/java/jvm/pictures/java\345\206\205\345\255\230\345\214\272\345\237\237/\345\257\271\350\261\241\347\232\204\350\256\277\351\227\256\345\256\232\344\275\215-\344\275\277\347\224\250\345\217\245\346\237\204.png"
new file mode 100644
index 00000000000..88b494732af
Binary files /dev/null and "b/docs/java/jvm/pictures/java\345\206\205\345\255\230\345\214\272\345\237\237/\345\257\271\350\261\241\347\232\204\350\256\277\351\227\256\345\256\232\344\275\215-\344\275\277\347\224\250\345\217\245\346\237\204.png" differ
diff --git "a/docs/java/jvm/pictures/java\345\206\205\345\255\230\345\214\272\345\237\237/\345\257\271\350\261\241\347\232\204\350\256\277\351\227\256\345\256\232\344\275\215-\347\233\264\346\216\245\346\214\207\351\222\210.png" "b/docs/java/jvm/pictures/java\345\206\205\345\255\230\345\214\272\345\237\237/\345\257\271\350\261\241\347\232\204\350\256\277\351\227\256\345\256\232\344\275\215-\347\233\264\346\216\245\346\214\207\351\222\210.png"
index 145bd405c21..f954d8a7375 100644
Binary files "a/docs/java/jvm/pictures/java\345\206\205\345\255\230\345\214\272\345\237\237/\345\257\271\350\261\241\347\232\204\350\256\277\351\227\256\345\256\232\344\275\215-\347\233\264\346\216\245\346\214\207\351\222\210.png" and "b/docs/java/jvm/pictures/java\345\206\205\345\255\230\345\214\272\345\237\237/\345\257\271\350\261\241\347\232\204\350\256\277\351\227\256\345\256\232\344\275\215-\347\233\264\346\216\245\346\214\207\351\222\210.png" differ
diff --git "a/docs/java/jvm/\347\261\273\345\212\240\350\275\275\350\277\207\347\250\213.md" "b/docs/java/jvm/\347\261\273\345\212\240\350\275\275\350\277\207\347\250\213.md"
index 947e1ad141e..5a1df706f0e 100644
--- "a/docs/java/jvm/\347\261\273\345\212\240\350\275\275\350\277\207\347\250\213.md"
+++ "b/docs/java/jvm/\347\261\273\345\212\240\350\275\275\350\277\207\347\250\213.md"
@@ -68,7 +68,7 @@ Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚
### 初始化
-初始化是类加载的最后一步,也是真正执行类中定义的 Java 程序代码(字节码),初始化阶段是执行类构造器 `