Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,7 @@ CAP 也就是 Consistency(一致性)、Availability(可用性)、Partiti

#### Paxos 算法和 Raft 算法

**Paxos 算法**诞生于 1900 年,这是一种解决分布式系统一致性的经典算法 。但是,由于 Paxos 算法非常难以理解和实现,不断有人尝试简化这一算法。到了2013 年才诞生了一个比 Paxos 算法更易理解和实现的分布式一致性算法—**Raft 算法**。
**Paxos 算法**诞生于 1990 年,这是一种解决分布式系统一致性的经典算法 。但是,由于 Paxos 算法非常难以理解和实现,不断有人尝试简化这一算法。到了2013 年才诞生了一个比 Paxos 算法更易理解和实现的分布式一致性算法—**Raft 算法**。

#### 搜索引擎

Expand Down
5 changes: 4 additions & 1 deletion docs/books/求职面试篇.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,7 @@

[《程序员面试逻辑题解析》](https://book.douban.com/subject/20452340/)

[《剑指Offer:名企面试官精讲典型编程题(第2版)》](https://book.douban.com/subject/27008702/)
[《剑指Offer:名企面试官精讲典型编程题(第2版)》](https://book.douban.com/subject/27008702/)

**[《Offer来了:Java面试核心知识点精讲》](https://book.douban.com/subject/34872163/)** : 这本书基本概括了Java程序员面试必备知识点,可以拿来准备Java面试或者夯实基础。不过,我还是更推荐我的 [JavaGuide](https://github.com/Snailclimb/JavaGuide) 和 **[《JavaGuide面试突击版》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486324&idx=1&sn=e8b690ddaedabc486bd399310105aad3&chksm=cea244bff9d5cda9a627fa65235be09e7b089e92cf49c0eb0ceb35b39bbed86c1fab0125f5af&token=1745528586&lang=zh_CN&scene=21#wechat_redirect)** ,两者配合起来学习,真香!

71 changes: 71 additions & 0 deletions docs/books/计算机基础.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
这部分内容我不光会推荐书籍,还会顺便推荐一些我觉得不错的教学视频&Project。



## 算法



## 操作系统

如果你要系统地学习操作系统的话,最硬核最权威的书籍是 **《操作系统导论》** 。你可以再配套一个 **《深入理解计算机系统》** 加深你对计算机系统本质的认识,美滋滋!

![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images/2020-10-12/image-20201012191645919.png)

如果你比较喜欢动手,对于理论知识比较抵触的话,我推荐你看看《30 天自制操作系统》,这本书会手把手教你编写一个操作系统。

![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images/2020-10-12/s11138117.jpg)

再推荐一个我的朋友总结的图解操作系统 PDF![点击此链接即可获取。](https://www.yuque.com/docs/share/61b99973-ecb3-4317-ba19-fc1a15dd842c?#)

![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images-6@main/12-04-1/image-20201204142453079.png)

如果你比较喜欢看视频的话,我建议你可以看看北京交通大学的慕课[《操作系统》](https://www.icourse163.org/course/NJTU-1003245001)。

![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images-6@main/12-04-1/image-20201204131429567.png)

这个视频课程基本把操作系统的体系结构、设计机理及实现方法和技术相关重要的知识点介绍的差不多了。

还有下面这个国外的课程 [《深入理解计算机系统 》](https://www.bilibili.com/video/av31289365?from=search&seid=16298868573410423104) 也很不错。

![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images-6@main/12-04-1/image-20201204140653318.png)

## 计算机网络

关于这门课,首先强烈推荐参考书是**机械工业出版社的《计算机网络——自顶向下方法》**。该书目录清晰,按照 TCP/IP 五层模型逐层讲解,对每层涉及的技术都展开了详细讨论,基本上高校里开设的课程的教学大纲就是这本书的目录了。

![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images/2020-10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C.jpg)

如果你觉得上面这本书看着比较枯燥的话,我强烈推荐+安利你看看下面这两本非常有趣的网络相关的书籍:

- [《图解 HTTP》](https://book.douban.com/subject/25863515/ "《图解 HTTP》") : 讲漫画一样的讲 HTTP,很有意思,不会觉得枯燥,大概也涵盖也 HTTP 常见的知识点。因为篇幅问题,内容可能不太全面。不过,如果不是专门做网络方向研究的小伙伴想研究 HTTP 相关知识的话,读这本书的话应该来说就差不多了。
- [《网络是怎样连接的》](https://book.douban.com/subject/26941639/ "《网络是怎样连接的》") :从在浏览器中输入网址开始,一路追踪了到显示出网页内容为止的整个过程,以图配文,讲解了网络的全貌,并重点介绍了实际的网络设备和软件是如何工作的。

![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images/2020-10/image-20201011215144139.png)

除了理论知识之外,学习计算机网络非常重要的一点就是:“**动手实践**”。这点和我们编程差不多。

Github 上就有一些名校的计算机网络试验/Project:

- [哈工大计算机网络实验](https://github.com/rccoder/HIT-Computer-Network)
- [《计算机网络-自顶向下方法(原书第6版)》编程作业,Wireshark实验文档的翻译和解答。](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES)
- [计算机网络的期末Project,用Python编写的聊天室](https://github.com/KevinWang15/network-pj-chatroom)
- [CMU的计算机网络课程](https://computer-networks.github.io/sp19/lectures.html)

我知道,还有很多小伙伴可能比较喜欢边看视频边学习。所以,我这里再推荐几个顶好的计算机网络视频讲解。

**1.[哈工大的计算机网络课程](http://www.icourse163.org/course/HIT-154005)** :国家精品课程,截止目前已经开了10次课了。大家对这门课的评价都非常高!所以,非常推荐大家看一下!

![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images-6@main/12-15-1/image-20201218141241911.png)

**2.[王道考研的计算机网络](https://www.bilibili.com/video/BV19E411D78Q?from=search&seid=17198507506906312317)** :非常适合CS专业考研的小朋友!这个视频目前在哔哩哔哩上已经有1.6w+的点赞。

![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images-6@main/12-18-1/image-20201218141652837.png)

除了上面推荐的书籍和视频之外,再推荐两篇计算机网络总结的文章:

- [计算机网络常见面试题](https://snailclimb.gitee.io/javaguide/#/docs/network/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C)
- [计算机网络基础知识总结](https://snailclimb.gitee.io/javaguide/#/docs/network/计算机网络知识总结)

最后再补充一个:[浙江大学的计算机网络课程资料、教材和试卷](https://github.com/QSCTech/zju-icicles/tree/master/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80) 。需要的小伙伴请查收!

15 changes: 7 additions & 8 deletions docs/books/软件质量篇.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,15 +78,15 @@ Bob 大叔将自己对整洁代码的理解浓缩在了这本书中,真可谓

### 《Effective java 》

![Effective Java中文版(第3版)](file:///Users/guide/Documents/GitHub/JavaGuide/docs/books/images/s32282160.png?lastModify=1615696092)
![Effective Java中文版(第3版)](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2021/03/s32282160.png)

**Java程序员必看!**

又是一本 Java 领域国宝级别的书,非常经典。这本书主要介绍了在 Java 编程中很多极具实用价值的经验规则,这些经验规则涵盖了大多数开发人员每天所面临的问题的解决方案。这篇文章能够非常实际地帮助你写出更加清晰、健壮和高效的代码。本书中的每条规则都以简短、独立的小文章形式出现,并通过例子代码加以进一步说明。

### 《人月神话》

![img](file:///Users/guide/Documents/GitHub/JavaGuide/docs/books/images/8ece325c-4491-4ffd-9d3d-77e95159ec40.png?lastModify=1615696092)
![img](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2021/03/8ece325c-4491-4ffd-9d3d-77e95159ec40.png)

这本书主要描述了软件开发的基本定律:**一个需要10天才能干完的活,不可能让10个人在1天干完!**

Expand All @@ -96,17 +96,16 @@ Bob 大叔将自己对整洁代码的理解浓缩在了这本书中,真可谓

### 《领域驱动设计:软件核心复杂性应对之道》

![img](file:///Users/guide/Documents/GitHub/JavaGuide/docs/books/images/7e80418d-20b1-4066-b9af-cfe434b1bf1a.png?lastModify=1615696092)
![img](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2021/03/7e80418d-20b1-4066-b9af-cfe434b1bf1a.png)

这本领域驱动设计方面的经典之作一直被各种推荐,但是我还来及读。

### 其他

- 《深入浅出设计模式》
- [《代码的未来》](https://book.douban.com/subject/24536403/) :作者是Ruby之父松本行弘。
- 《系统架构》
- 《软件架构设计:大型网站技术架构与业务架构融合之道》 :
- 《微服务架构设计模式》 :这本书是世界十大软件架构师之一、微服务架构先驱Chris Richardson亲笔撰写,豆瓣评分9.6。示例代码使用Java语言和Spring框架。帮助你设计、实现、测试和部署基于微服务的应用程序。
- [《代码的未来》](https://book.douban.com/subject/24536403/) :这本书的作者是Ruby之父松本行弘,算是一本年代比较久远的书籍(13年出版),不过,还是非常值得一读。这本书的内容主要介绍是编程/编程语言的本质。我个人还是比较喜欢松本行弘的文字风格,并且,你看他的文章也确实能够有所收获。
- [《深入浅出设计模式》](https://book.douban.com/subject/1488876/) : 比较有趣的风格,适合设计模式入门。
- [《软件架构设计:大型网站技术架构与业务架构融合之道》](https://book.douban.com/subject/30443578/) : 内容非常全面。适合面试前突击一些比较重要的理论知识,也适合拿来扩充/完善自己的技术广度。
- [《微服务架构设计模式》](https://book.douban.com/subject/33425123/) :这本书是世界十大软件架构师之一、微服务架构先驱Chris Richardson亲笔撰写,豆瓣评分9.6。示例代码使用Java语言和Spring框架。帮助你设计、实现、测试和部署基于微服务的应用程序。

最后再推荐两个相关的文档:

Expand Down
2 changes: 0 additions & 2 deletions docs/database/MySQL.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@

由于 MySQL 是开源免费并且比较成熟的数据库,因此,MySQL 被大量使用在各种系统中。任何人都可以在 GPL(General Public License) 的许可下下载并根据个性化的需要对其进行修改。MySQL的默认端口号是**3306**。



### 存储引擎

#### 一些常用命令
Expand Down
2 changes: 1 addition & 1 deletion docs/java/basis/Java基础知识.md
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ Method add = clazz.getDeclaredMethod("add", Object.class);
//但是通过反射添加,是可以的
add.invoke(list, "kl");

System.out.println(list)
System.out.println(list);
```

泛型一般有三种使用方式:泛型类、泛型接口、泛型方法。
Expand Down
6 changes: 3 additions & 3 deletions docs/java/jvm/类加载器.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

## 回顾一下类加载过程

类加载过程:**加载->连接->初始化**。连接过程又可分为三步:**验证->准备->解析**。
类加载过程:**加载->连接->初始化**。连接过程又可分为三步**验证->准备->解析**。

![类加载过程](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/类加载过程.png)

Expand All @@ -30,7 +30,7 @@ JVM 中内置了三个重要的 ClassLoader,除了 BootstrapClassLoader 其他

1. **BootstrapClassLoader(启动类加载器)** :最顶层的加载类,由C++实现,负责加载 `%JAVA_HOME%/lib`目录下的jar包和类或者或被 `-Xbootclasspath`参数指定的路径中的所有类。
2. **ExtensionClassLoader(扩展类加载器)** :主要负责加载目录 `%JRE_HOME%/lib/ext` 目录下的jar包和类,或被 `java.ext.dirs` 系统变量所指定的路径下的jar包。
3. **AppClassLoader(应用程序类加载器)** :面向我们用户的加载器,负责加载当前应用classpath下的所有jar包和类。
3. **AppClassLoader(应用程序类加载器)** 面向我们用户的加载器,负责加载当前应用classpath下的所有jar包和类。

## 双亲委派模型

Expand Down Expand Up @@ -60,7 +60,7 @@ The Parent of ClassLodarDemo's ClassLoader is sun.misc.Launcher$ExtClassLoader@1
The GrandParent of ClassLodarDemo's ClassLoader is null
```

`AppClassLoader`的父类加载器为`ExtClassLoader`
`AppClassLoader`的父类加载器为`ExtClassLoader`
`ExtClassLoader`的父类加载器为null,**null并不代表`ExtClassLoader`没有父类加载器,而是 `BootstrapClassLoader`** 。

其实这个双亲翻译的容易让别人误解,我们一般理解的双亲都是父母,这里的双亲更多地表达的是“父母这一辈”的人而已,并不是说真的有一个 Mother ClassLoader 和一个 Father ClassLoader 。另外,类加载器之间的“父子”关系也不是通过继承来体现的,是由“优先级”来决定。官方API文档对这部分的描述如下:
Expand Down
10 changes: 5 additions & 5 deletions docs/java/jvm/类加载过程.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@

Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚拟机是如何加载这些 Class 文件呢?

系统加载 Class 类型的文件主要三步:**加载->连接->初始化**。连接过程又可分为三步:**验证->准备->解析**。
系统加载 Class 类型的文件主要三步**加载->连接->初始化**。连接过程又可分为三步**验证->准备->解析**。

![](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/类加载过程.png)

Expand All @@ -33,7 +33,7 @@ Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚

1. 通过全类名获取定义此类的二进制字节流
2. 将字节流所代表的静态存储结构转换为方法区的运行时数据结构
3. 在内存中生成一个代表该类的 Class 对象,作为方法区这些数据的访问入口
3. 在内存中生成一个代表该类的 Class 对象作为方法区这些数据的访问入口

虚拟机规范上面这3点并不具体,因此是非常灵活的。比如:"通过全类名获取定义此类的二进制字节流" 并没有指明具体从哪里获取、怎样获取。比如:比较常见的就是从 ZIP 包中读取(日后出现的JAR、EAR、WAR格式的基础)、其他文件生成(典型应用就是JSP)等等。

Expand Down Expand Up @@ -70,7 +70,7 @@ Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚

初始化是类加载的最后一步,也是真正执行类中定义的 Java 程序代码(字节码),初始化阶段是执行初始化方法 `<clinit> ()`方法的过程。

对于`<clinit>()` 方法的调用,虚拟机会自己确保其在多线程环境中的安全性。因为 `<clinit>()` 方法是带锁线程安全,所以在多线程环境下进行类初始化的话可能会引起死锁,并且这种死锁很难被发现。
对于`<clinit> ()` 方法的调用,虚拟机会自己确保其在多线程环境中的安全性。因为 `<clinit> ()` 方法是带锁线程安全,所以在多线程环境下进行类初始化的话可能会引起死锁,并且这种死锁很难被发现。

对于初始化阶段,虚拟机严格规范了有且只有5种情况下,必须对类进行初始化(只有主动去使用类才会初始化类):

Expand All @@ -79,7 +79,7 @@ Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚
- 当jvm执行getstatic指令时会初始化类。即程序访问类的静态变量(不是静态常量,常量会被加载到运行时常量池)。
- 当jvm执行putstatic指令时会初始化类。即程序给类的静态变量赋值。
- 当jvm执行invokestatic指令时会初始化类。即程序调用类的静态方法。
2. 使用 `java.lang.reflect` 包的方法对类进行反射调用时如Class.forname("..."),newInstance()等等。如果类没初始化,需要触发其初始化。
2. 使用 `java.lang.reflect` 包的方法对类进行反射调用时如Class.forname("..."), newInstance()等等。如果类没初始化,需要触发其初始化。
3. 初始化一个类,如果其父类还未初始化,则先触发该父类的初始化。
4. 当虚拟机启动时,用户需要定义一个要执行的主类 (包含 main 方法的那个类),虚拟机会先初始化这个类。
5. MethodHandle和VarHandle可以看作是轻量级的反射调用机制,而要想使用这2个调用,
Expand All @@ -100,7 +100,7 @@ Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚

所以,在JVM生命周期类,由jvm自带的类加载器加载的类是不会被卸载的。但是由我们自定义的类加载器加载的类是可能被卸载的。

只要想通一点就好了,jdk自带的BootstrapClassLoader,ExtClassLoader,AppClassLoader负责加载jdk提供的类,所以它们(类加载器的实例)肯定不会被回收。而我们自定义的类加载器的实例是可以被回收的,所以使用我们自定义加载器加载的类是可以被卸载掉的。
只要想通一点就好了,jdk自带的BootstrapClassLoader, ExtClassLoader, AppClassLoader负责加载jdk提供的类,所以它们(类加载器的实例)肯定不会被回收。而我们自定义的类加载器的实例是可以被回收的,所以使用我们自定义加载器加载的类是可以被卸载掉的。

**参考**

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ Cookie 和 Session都是用来跟踪浏览器用户身份的会话方式,但

### 2.2 如何在服务端使用 Cookie 呢?

这部分内容参考:https://attacomsian.com/blog/cookies-spring-boot 更多如何在Spring Boot中使用Cookie 的内容可以查看这篇文章。
这部分内容参考:https://attacomsian.com/blog/cookies-spring-boot, 更多如何在Spring Boot中使用Cookie 的内容可以查看这篇文章。

**1)设置cookie返回给客户端**

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ if (sendResult.getRecordMetadata() != null) {

当消费者拉取到了分区的某个消息之后,消费者会自动提交了 offset。自动提交的话会有一个问题,试想一下,当消费者刚拿到这个消息准备进行真正消费的时候,突然挂掉了,消息实际上并没有被消费,但是 offset 却被自动提交了。

**解决办法也比较粗暴,我们手动关闭闭自动提交 offset,每次在真正消费完消息之后之后再自己手动提交 offset 。** 但是,细心的朋友一定会发现,这样会带来消息被重新消费的问题。比如你刚刚消费完消息之后,还没提交 offset,结果自己挂掉了,那么这个消息理论上就会被消费两次。
**解决办法也比较粗暴,我们手动关闭自动提交 offset,每次在真正消费完消息之后之后再自己手动提交 offset 。** 但是,细心的朋友一定会发现,这样会带来消息被重新消费的问题。比如你刚刚消费完消息之后,还没提交 offset,结果自己挂掉了,那么这个消息理论上就会被消费两次。

#### Kafka 弄丢了消息

Expand Down
2 changes: 1 addition & 1 deletion docs/system-design/framework/mybatis/mybatis-interview.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ MyBatis 技术内幕系列博客,从原理和源码角度,介绍了其内部
- `${}`是 Properties 文件中的变量占位符,它可以用于标签属性值和 sql 内部,属于静态文本替换,比如\${driver}会被静态替换为`com.mysql.jdbc.Driver`。
- `#{}`是 sql 的参数占位符,MyBatis 会将 sql 中的`#{}`替换为?号,在 sql 执行前会使用 PreparedStatement 的参数设置方法,按序给 sql 的?号占位符设置参数值,比如 ps.setInt(0, parameterValue),`#{item.name}` 的取值方式为使用反射从参数对象中获取 item 对象的 name 属性值,相当于 `param.getItem().getName()`。

#### 2、Xml 映射文件中,除了常见的 select|insert|updae|delete 标签之外,还有哪些标签?
#### 2、Xml 映射文件中,除了常见的 select|insert|update|delete 标签之外,还有哪些标签?

注:这道题是京东面试官面试我时问的。

Expand Down
Loading