From f25cdaddfa114cf23c9cab501b717a973cb95490 Mon Sep 17 00:00:00 2001 From: HuYe Date: Tue, 8 Jun 2021 17:29:29 +0800 Subject: [PATCH 01/10] Update java8-common-new-features.md fix typo --- docs/java/new-features/java8-common-new-features.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/java/new-features/java8-common-new-features.md b/docs/java/new-features/java8-common-new-features.md index d736ffba..540ccf02 100644 --- a/docs/java/new-features/java8-common-new-features.md +++ b/docs/java/new-features/java8-common-new-features.md @@ -510,7 +510,7 @@ ForkJoinPool.commonPool-worker-9>>2 > > 正例:使用 JDK8 的 Optional 类来防止 NPE 问题。 -他建议使用 `Optional` 解决 NPE(`java.lang.NumberFormatException`)问题,它就是为 NPE 而生的,其中可以包含空值或非空值。下面我们通过源码逐步揭开 `Optional` 的红盖头。 +他建议使用 `Optional` 解决 NPE(`java.lang.NullPointerException`)问题,它就是为 NPE 而生的,其中可以包含空值或非空值。下面我们通过源码逐步揭开 `Optional` 的红盖头。 假设有一个 `Zoo` 类,里面有个属性 `Dog`,需求要获取 `Dog` 的 `age`。 From 9e6bfac997d201a7a935ca9db037d20f863e8a17 Mon Sep 17 00:00:00 2001 From: HuYe Date: Tue, 8 Jun 2021 21:39:04 +0800 Subject: [PATCH 02/10] fix typo --- docs/java/new-features/java8-common-new-features.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/java/new-features/java8-common-new-features.md b/docs/java/new-features/java8-common-new-features.md index 540ccf02..69a9b7f7 100644 --- a/docs/java/new-features/java8-common-new-features.md +++ b/docs/java/new-features/java8-common-new-features.md @@ -537,7 +537,7 @@ if(zoo != null){ } ``` -层层判断对象分空,有人说这种方式很丑陋不优雅,我并不这么认为。反而觉得很整洁,易读,易懂。你们觉得呢? +层层判断对象非空,有人说这种方式很丑陋不优雅,我并不这么认为。反而觉得很整洁,易读,易懂。你们觉得呢? `Optional` 是这样的实现的: From 9de9b145fb33049f0ed0641e8fdca3ef82e375f4 Mon Sep 17 00:00:00 2001 From: HuYe Date: Wed, 9 Jun 2021 10:39:00 +0800 Subject: [PATCH 03/10] =?UTF-8?q?=E9=94=99=E5=88=AB=E5=AD=97=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data-structure/线性数据结构.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/dataStructures-algorithms/data-structure/线性数据结构.md b/docs/dataStructures-algorithms/data-structure/线性数据结构.md index c592a9ea..f00264aa 100644 --- a/docs/dataStructures-algorithms/data-structure/线性数据结构.md +++ b/docs/dataStructures-algorithms/data-structure/线性数据结构.md @@ -78,9 +78,9 @@ ### 2.4. 数组 vs 链表 -- 数据支持随机访问,而链表不支持。 +- 数组支持随机访问,而链表不支持。 - 数组使用的是连续内存空间对 CPU 的缓存机制友好,链表则相反。 -- 数据的大小固定,而链表则天然支持动态扩容。如果声明的数组过小,需要另外申请一个更大的内存空间存放数组元素,然后将原数组拷贝进去,这个操作是比较耗时的! +- 数组的大小固定,而链表则天然支持动态扩容。如果声明的数组过小,需要另外申请一个更大的内存空间存放数组元素,然后将原数组拷贝进去,这个操作是比较耗时的! ## 3. 栈 From 4f0a9123706e7e72e1e519b010c746913590ad0a Mon Sep 17 00:00:00 2001 From: HuYe Date: Wed, 9 Jun 2021 11:30:12 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20Linux=20=E4=B9=8B?= =?UTF-8?q?=E7=88=B6=E5=A7=93=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/operating-system/linux.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/operating-system/linux.md b/docs/operating-system/linux.md index 7f318ccc..8b0b98ec 100644 --- a/docs/operating-system/linux.md +++ b/docs/operating-system/linux.md @@ -163,7 +163,7 @@ _玩玩电脑游戏还是必须要有 Windows 的,所以我现在是一台 Win - **类 Unix 系统** : Linux 是一种自由、开放源码的类似 Unix 的操作系统 - **Linux 本质是指 Linux 内核** : 严格来讲,Linux 这个词本身只表示 Linux 内核,单独的 Linux 内核并不能成为一个可以正常工作的操作系统。所以,就有了各种 Linux 发行版。 -- **Linux 之父** : 一个编程领域的传奇式人物,真大佬!我辈崇拜敬仰之楷模。他是 **Linux 内核** 的最早作者,随后发起了这个开源项目,担任 Linux 内核的首要架构师。他还发起了 Git 这个开源项目,并为主要的开发者。 +- **Linux 之父(林纳斯·本纳第克特·托瓦兹 Linus Benedict Torvalds)** : 一个编程领域的传奇式人物,真大佬!我辈崇拜敬仰之楷模。他是 **Linux 内核** 的最早作者,随后发起了这个开源项目,担任 Linux 内核的首要架构师。他还发起了 Git 这个开源项目,并为主要的开发者。 ![Linux](images/Linux之父.png) From 095daa72310d46e16865614b3fa8ba79e620c83f Mon Sep 17 00:00:00 2001 From: TommyMerlin <786731256@qq.com> Date: Wed, 9 Jun 2021 15:30:33 +0800 Subject: [PATCH 05/10] fix typo --- docs/operating-system/linux.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/operating-system/linux.md b/docs/operating-system/linux.md index 8b0b98ec..80b52fba 100644 --- a/docs/operating-system/linux.md +++ b/docs/operating-system/linux.md @@ -303,7 +303,7 @@ Linux 中的打包文件一般是以.tar 结尾的,压缩的命令一般是以 **2)解压压缩包:** -命令:`tar [-xvf] 压缩文件`` +命令:`tar [-xvf] 压缩文件` 其中:x:代表解压 From cc594c976ec14b994d3a9b2e578f5e864c041071 Mon Sep 17 00:00:00 2001 From: TommyMerlin <786731256@qq.com> Date: Wed, 9 Jun 2021 15:59:32 +0800 Subject: [PATCH 06/10] fix typo --- docs/operating-system/basis.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/operating-system/basis.md b/docs/operating-system/basis.md index 9276f040..49048648 100644 --- a/docs/operating-system/basis.md +++ b/docs/operating-system/basis.md @@ -8,7 +8,7 @@ 开始本文的内容之前,我们先聊聊为什么要学习操作系统。 -- **从对个人能力方面提升来说** :操作系统中的很多思想、很多经典的算法,你都可以在我们日常开发使用的各种工具或者框架中找到它们的影子。比如说我们开发的系统使用的缓存(比如 Redis)和操作系统的高速缓存就很像。CPU 中的高速缓存有很多种,不过大部分都是为了解决 CPU 处理速度和内存处理速度不对等的问题。我们还可以把内存可以看作外存的高速缓存,程序运行的时候我们把外存的数据复制到内存,由于内存的处理速度远远高于外存,这样提高了处理速度。同样地,我们使用的 Redis 缓存就是为了解决程序处理速度和访问常规关系型数据库速度不对等的问题。高速缓存一般会按照局部性原理(2-8 原则)根据相应的淘汰算法保证缓存中的数据是经常会被访问的。我们平常使用的 Redis 缓存很多时候也会按照 2-8 原则去做,很多淘汰算法都和操作系统中的类似。既说了 2-8 原则,那就不得不提命中率了,这是所有缓存概念都通用的。简单来说也就是你要访问的数据有多少能直接在缓存中直接找到。命中率高的话,一般表明你的缓存设计比较合理,系统处理速度也相对较快。 +- **从对个人能力方面提升来说** :操作系统中的很多思想、很多经典的算法,你都可以在我们日常开发使用的各种工具或者框架中找到它们的影子。比如说我们开发的系统使用的缓存(比如 Redis)和操作系统的高速缓存就很像。CPU 中的高速缓存有很多种,不过大部分都是为了解决 CPU 处理速度和内存处理速度不对等的问题。我们还可以把内存看作外存的高速缓存,程序运行的时候我们把外存的数据复制到内存,由于内存的处理速度远远高于外存,这样提高了处理速度。同样地,我们使用的 Redis 缓存就是为了解决程序处理速度和访问常规关系型数据库速度不对等的问题。高速缓存一般会按照局部性原理(2-8 原则)根据相应的淘汰算法保证缓存中的数据是经常会被访问的。我们平常使用的 Redis 缓存很多时候也会按照 2-8 原则去做,很多淘汰算法都和操作系统中的类似。既说了 2-8 原则,那就不得不提命中率了,这是所有缓存概念都通用的。简单来说也就是你要访问的数据有多少能直接在缓存中直接找到。命中率高的话,一般表明你的缓存设计比较合理,系统处理速度也相对较快。 - **从面试角度来说** :尤其是校招,对于操作系统方面知识的考察是非常非常多的。 **简单来说,学习操作系统能够提高自己思考的深度以及对技术的理解力,并且,操作系统方面的知识也是面试必备。** From d290240bc147274fd261de8eae632f5b2173b721 Mon Sep 17 00:00:00 2001 From: TommyMerlin <786731256@qq.com> Date: Wed, 9 Jun 2021 16:40:49 +0800 Subject: [PATCH 07/10] fix typo --- docs/operating-system/Shell.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/docs/operating-system/Shell.md b/docs/operating-system/Shell.md index 53466d11..cd65827f 100644 --- a/docs/operating-system/Shell.md +++ b/docs/operating-system/Shell.md @@ -51,7 +51,6 @@ 简单来说“Shell编程就是对一堆Linux命令的逻辑化处理”。 - W3Cschool 上的一篇文章是这样介绍 Shell的,如下图所示。 ![什么是 Shell?](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-11-26/19456505.jpg) @@ -91,7 +90,7 @@ shell中 # 符号表示注释。**shell 的第一行比较特殊,一般都会 **Shell编程中一般分为三种变量:** 1. **我们自己定义的变量(自定义变量):** 仅在当前 Shell 实例中有效,其他 Shell 启动的程序不能访问局部变量。 -2. **Linux已定义的环境变量**(环境变量, 例如:$PATH, $HOME 等..., 这类变量我们可以直接使用),使用 `env` 命令可以查看所有的环境变量,而set命令既可以查看环境变量也可以查看自定义变量。 +2. **Linux已定义的环境变量**(环境变量, 例如:`PATH`, ​`HOME` 等..., 这类变量我们可以直接使用),使用 `env` 命令可以查看所有的环境变量,而set命令既可以查看环境变量也可以查看自定义变量。 3. **Shell变量** :Shell变量是由 Shell 程序设置的特殊变量。Shell 变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了 Shell 的正常运行 **常用的环境变量:** @@ -347,7 +346,6 @@ echo $a; 简单示例: ```shell - #!/bin/bash a="abc"; b="efg"; @@ -530,8 +528,6 @@ echo "输入的两个数字之和为 $?" ### 带参数的函数 - - ```shell #!/bin/bash funWithParam(){ @@ -544,7 +540,6 @@ funWithParam(){ echo "作为一个字符串输出所有参数 $* !" } funWithParam 1 2 3 4 5 6 7 8 9 34 73 - ``` 输出结果: @@ -557,5 +552,4 @@ funWithParam 1 2 3 4 5 6 7 8 9 34 73 第十一个参数为 73 ! 参数总数有 11 个! 作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 ! - ``` From 52fb411bc0d18fcdf2b4cc6c40be60302b6f5cc7 Mon Sep 17 00:00:00 2001 From: TommyMerlin <786731256@qq.com> Date: Wed, 9 Jun 2021 17:18:24 +0800 Subject: [PATCH 08/10] fix typo --- docs/network/计算机网络.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/network/计算机网络.md b/docs/network/计算机网络.md index 10fc157f..d89e1e9e 100644 --- a/docs/network/计算机网络.md +++ b/docs/network/计算机网络.md @@ -32,7 +32,7 @@ ### 1.3 网络层 -**在 计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。** 在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在 TCP/IP 体系结构中,由于网络层使用 **IP 协议**,因此分组也叫 **IP 数据报** ,简称 **数据报**。 +**在计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。** 在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在 TCP/IP 体系结构中,由于网络层使用 **IP 协议**,因此分组也叫 **IP 数据报** ,简称 **数据报**。 这里要注意:**不要把运输层的“用户数据报 UDP ”和网络层的“ IP 数据报”弄混**。另外,无论是哪一层的数据单元,都可笼统地用“分组”来表示。 @@ -44,6 +44,7 @@ **数据链路层(data link layer)通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。** 在两个相邻节点之间传送数据时,**数据链路层将网络层交下来的 IP 数据报组装成帧**,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。 在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。这样,数据链路层在收到一个帧后,就可从中提出数据部分,上交给网络层。 + 控制信息还使接收端能够检测到所收到的帧中有无差错。如果发现差错,数据链路层就简单地丢弃这个出了差错的帧,以避免继续在网络中传送下去白白浪费网络资源。如果需要改正数据在链路层传输时出现差错(这就是说,数据链路层不仅要检错,而且还要纠错),那么就要采用可靠性传输协议来纠正出现的差错。这种方法会使链路层的协议复杂些。 ### 1.5 物理层 From 075488375d39fde69765b3f52548654061ef44e8 Mon Sep 17 00:00:00 2001 From: TommyMerlin <786731256@qq.com> Date: Wed, 9 Jun 2021 21:29:02 +0800 Subject: [PATCH 09/10] fix typo --- .../framework/spring/Spring常见问题总结.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/system-design/framework/spring/Spring常见问题总结.md b/docs/system-design/framework/spring/Spring常见问题总结.md index 99b0d981..774d4eb0 100644 --- a/docs/system-design/framework/spring/Spring常见问题总结.md +++ b/docs/system-design/framework/spring/Spring常见问题总结.md @@ -83,11 +83,11 @@ IoC源码阅读 AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,**却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来**,便于**减少系统的重复代码**,**降低模块间的耦合度**,并**有利于未来的可拓展性和可维护性**。 -**Spring AOP就是基于动态代理的**,如果要代理的对象,实现了某个接口,那么Spring AOP会使用**JDK Proxy**,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候Spring AOP会使用**Cglib** ,这时候Spring AOP会使用 **Cglib** 生成一个被代理对象的子类来作为代理,如下图所示: +**Spring AOP就是基于动态代理的**,如果要代理的对象,实现了某个接口,那么Spring AOP会使用**JDK Proxy**,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候Spring AOP会使用**Cglib**生成一个被代理对象的子类来作为代理,如下图所示: ![SpringAOPProcess](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/SpringAOPProcess.jpg) -当然你也可以使用 AspectJ ,Spring AOP 已经集成了AspectJ ,AspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。 +当然你也可以使用 AspectJ,Spring AOP 已经集成了AspectJ,AspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。 使用 AOP 之后我们可以把一些通用功能抽象出来,在需要用到的地方直接使用即可,这样大大简化了代码量。我们需要增加新功能时也方便,这样也提高了系统扩展性。日志功能、事务管理等等场景都用到了 AOP 。 @@ -117,7 +117,7 @@ AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无 常见的有 2 种解决办法: -2. 在类中定义一个 `ThreadLocal` 成员变量,将需要的可变成员变量保存在 `ThreadLocal` 中(推荐的一种方式)。 +1. 在类中定义一个 `ThreadLocal` 成员变量,将需要的可变成员变量保存在 `ThreadLocal` 中(推荐的一种方式)。 2. 改变 Bean 的作用域为 “prototype”:每次请求都会创建一个新的 bean 实例,自然不会存在线程安全问题。 From 55af506dbd645ea519b0cf599c50751020d071da Mon Sep 17 00:00:00 2001 From: TommyMerlin <786731256@qq.com> Date: Wed, 9 Jun 2021 22:29:46 +0800 Subject: [PATCH 10/10] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E7=9A=84=20spring-boot-starter-web=20?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E4=B8=AD=E4=B8=8D=E5=86=8D=E6=9C=89=20hibern?= =?UTF-8?q?ate-validator=20=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/spring/SpringBoot+Spring常用注解总结.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/system-design/framework/spring/SpringBoot+Spring常用注解总结.md b/docs/system-design/framework/spring/SpringBoot+Spring常用注解总结.md index e60eeef2..1e741e75 100644 --- a/docs/system-design/framework/spring/SpringBoot+Spring常用注解总结.md +++ b/docs/system-design/framework/spring/SpringBoot+Spring常用注解总结.md @@ -409,6 +409,8 @@ class WebSite { SpringBoot 项目的 spring-boot-starter-web 依赖中已经有 hibernate-validator 包,不需要引用相关依赖。如下图所示(通过 idea 插件—Maven Helper 生成): +**注**:更新版本的 spring-boot-starter-web 依赖中不再有 hibernate-validator 包(如2.3.11.RELEASE),需要自己引入 `spring-boot-starter-validation` 依赖。 + ![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2021/03/c7bacd12-1c1a-4e41-aaaf-4cad840fc073.png) 非 SpringBoot 项目需要自行引入相关依赖包,这里不多做讲解,具体可以查看我的这篇文章:《[如何在 Spring/Spring Boot 中做参数校验?你需要了解的都在这里!](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485783&idx=1&sn=a407f3b75efa17c643407daa7fb2acd6&chksm=cea2469cf9d5cf8afbcd0a8a1c9cc4294d6805b8e01bee6f76bb2884c5bc15478e91459def49&token=292197051&lang=zh_CN#rd)》。