diff --git a/docs/notes/Docker.md b/docs/notes/Docker.md
index 6ce2d961..701d53ca 100644
--- a/docs/notes/Docker.md
+++ b/docs/notes/Docker.md
@@ -12,7 +12,7 @@
由于不同的机器有不同的操作系统,以及不同的库和组件,在将一个应用部署到多台机器上需要进行大量的环境配置操作。
-Docker 主要解决环境配置问题,它是一种虚拟化技术,对进程进行隔离,被隔离的进程独立于宿主操作系统和其它隔离的进程。使用 Docker 可以不修改应用程序代码,不需要开发人员学习特定环境下的技术,就能够将现有的应用程序部署在其他机器中。
+Docker 主要解决环境配置问题,它是一种虚拟化技术,对进程进行隔离,被隔离的进程独立于宿主操作系统和其它隔离的进程。使用 Docker 可以不修改应用程序代码,不需要开发人员学习特定环境下的技术,就能够将现有的应用程序部署在其它机器上。
@@ -20,19 +20,17 @@ Docker 主要解决环境配置问题,它是一种虚拟化技术,对进程
虚拟机也是一种虚拟化技术,它与 Docker 最大的区别在于它是通过模拟硬件,并在硬件上安装操作系统来实现。
-
-
-
+
## 启动速度
-启动虚拟机需要启动虚拟机的操作系统,再启动应用,这个过程非常慢;
+启动虚拟机需要先启动虚拟机的操作系统,再启动应用,这个过程非常慢;
而启动 Docker 相当于启动宿主操作系统上的一个进程。
## 占用资源
-虚拟机是一个完整的操作系统,需要占用大量的磁盘、内存和 CPU,一台机器只能开启几十个的虚拟机。
+虚拟机是一个完整的操作系统,需要占用大量的磁盘、内存和 CPU 资源,一台机器只能开启几十个的虚拟机。
而 Docker 只是一个进程,只需要将应用以及相关的组件打包,在运行时占用很少的资源,一台机器可以开启成千上万个 Docker。
@@ -42,11 +40,11 @@ Docker 主要解决环境配置问题,它是一种虚拟化技术,对进程
## 更容易迁移
-提供一致性的运行环境,可以在不同的机器上进行迁移,而不用担心环境变化导致无法运行。
+提供一致性的运行环境。已经打包好的应用可以在不同的机器上进行迁移,而不用担心环境变化导致无法运行。
## 更容易维护
-使用分层技术和镜像,使得应用可以更容易复用重复部分。复用程度越高,维护工作也越容易。
+使用分层技术和镜像,使得应用可以更容易复用重复的部分。复用程度越高,维护工作也越容易。
## 更容易扩展
diff --git a/docs/notes/Git.md b/docs/notes/Git.md
index 4c6b3e73..47ac0888 100644
--- a/docs/notes/Git.md
+++ b/docs/notes/Git.md
@@ -47,14 +47,14 @@ Git 的版本库有一个称为 Stage 的暂存区以及最后的 History 版本
- git reset -- files 使用当前分支上的修改覆盖暂存区,用来撤销最后一次 git add files
- git checkout -- files 使用暂存区的修改覆盖工作目录,用来撤销本地修改
-
+
可以跳过暂存区域直接从分支中取出修改,或者直接提交修改到分支中。
- git commit -a 直接把所有文件的修改添加到暂存区然后执行提交
- git checkout HEAD -- files 取出最后一次修改,可以用来进行回滚操作
-
+
# 分支实现
diff --git a/docs/notes/HTTP.md b/docs/notes/HTTP.md
index b00979b8..a7429bec 100644
--- a/docs/notes/HTTP.md
+++ b/docs/notes/HTTP.md
@@ -776,7 +776,7 @@ GET 用于获取资源,而 POST 用于传输实体主体。
GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL 中,而 POST 的参数存储在实体主体中。不能因为 POST 参数存储在实体主体中就认为它的安全性更高,因为照样可以通过一些抓包工具(Fiddler)查看。
-因为 URL 只支持 ASCII 码,因此 GET 的参数中如果存在中文等字符就需要先进行编码。例如 `中文` 会转换为 `%E4%B8%AD%E6%96%87`,而空格会转换为 `%20`。POST 参考支持标准字符集。
+因为 URL 只支持 ASCII 码,因此 GET 的参数中如果存在中文等字符就需要先进行编码。例如 `中文` 会转换为 `%E4%B8%AD%E6%96%87`,而空格会转换为 `%20`。POST 参数支持标准字符集。
```
GET /test/demo_form.asp?name1=value1&name2=value2 HTTP/1.1
diff --git a/docs/notes/Java 基础.md b/docs/notes/Java 基础.md
index 3068e439..ebde0866 100644
--- a/docs/notes/Java 基础.md
+++ b/docs/notes/Java 基础.md
@@ -53,7 +53,7 @@
- double/64
- boolean/\~
-boolean 只有两个值:true、false,可以使用 1 bit 来存储,但是具体大小没有明确规定。JVM 会在编译时期将 boolean 类型的数据转换为 int,使用 1 来表示 true,0 表示 false。JVM 并不直接支持 boolean 数组,而是使用 byte 数组来表示 int 数组来表示。
+boolean 只有两个值:true、false,可以使用 1 bit 来存储,但是具体大小没有明确规定。JVM 会在编译时期将 boolean 类型的数据转换为 int,使用 1 来表示 true,0 表示 false。JVM 支持 boolean 数组,但是是通过读写 byte 数组来实现的。
- [Primitive Data Types](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html)
- [The Java® Virtual Machine Specification](https://docs.oracle.com/javase/specs/jvms/se8/jvms8.pdf)
@@ -670,10 +670,29 @@ SuperExtendExample.func()
为了满足里式替换原则,重写有有以下两个限制:
-- 子类方法的访问权限必须大于等于父类方法;
-- 子类方法的返回类型必须是父类方法返回类型或为其子类型。
+使用 @Override 注解,可以让编译器帮忙检查是否满足上面的三个限制条件。
-使用 @Override 注解,可以让编译器帮忙检查是否满足上面的两个限制条件。
+下面的示例中,SubClass 为 SuperClass 的子类,SubClass 重写了 SuperClass 的 func() 方法。其中:
+
+- 子类方法访问权限为 public,大于父类的 protected。
+- 子类的返回类型为 ArrayList,是父类返回类型 List 的子类。
+- 子类抛出的异常类型为 Exception,是父类抛出异常 Throwable 的子类。
+- 子类重写方法使用 @Override 注解,从而让编译器自动检查是否满足限制条件。
+
+```java
+class SuperClass {
+ protected List func() throws Throwable {
+ return new ArrayList<>();
+ }
+}
+
+class SubClass extends SuperClass {
+ @Override
+ public ArrayList func() throws Exception {
+ return new ArrayList<>();
+ }
+}
+```
**2. 重载(Overload)**
diff --git a/docs/notes/Java 容器.md b/docs/notes/Java 容器.md
index 22ee80d6..ff906df2 100644
--- a/docs/notes/Java 容器.md
+++ b/docs/notes/Java 容器.md
@@ -20,6 +20,7 @@
# 一、概览
+
容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表。
## Collection
@@ -114,7 +115,7 @@ List list = Arrays.asList(1, 2, 3);
### 1. 概览
-实现了 RandomAccess 接口,因此支持随机访问。这是理所当然的,因为 ArrayList 是基于数组实现的。
+因为 ArrayList 是基于数组实现的,所以支持快速随机访问。RandomAccess 接口标识着该类支持快速随机访问。
```java
public class ArrayList extends AbstractList
diff --git a/docs/notes/Java 并发.md b/docs/notes/Java 并发.md
index 9505fb4e..6542ac8a 100644
--- a/docs/notes/Java 并发.md
+++ b/docs/notes/Java 并发.md
@@ -73,7 +73,7 @@
包含了操作系统线程状态中的 Running 和 Ready。
-## 阻塞(Blocking)
+## 阻塞(Blocked)
等待获取一个排它锁,如果其线程释放了锁就会结束此状态。
@@ -1198,7 +1198,7 @@ public static void main(String[] args) throws InterruptedException {
可见性指当一个线程修改了共享变量的值,其它线程能够立即得知这个修改。Java 内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值来实现可见性的。
-主要有有三种实现可见性的方式:
+主要有三种实现可见性的方式:
- volatile
- synchronized,对一个变量执行 unlock 操作之前,必须把变量值同步回主内存。
diff --git a/docs/notes/Java 虚拟机.md b/docs/notes/Java 虚拟机.md
index 6df7df0b..b8981a10 100644
--- a/docs/notes/Java 虚拟机.md
+++ b/docs/notes/Java 虚拟机.md
@@ -129,7 +129,7 @@ public class Test {
}
```
-在上述代码中,a与b引用的对象实例互相持有了对象的引用,因此当我们把对a对象与b对象的引用去除之后,由于两个对象还存在互相之间的引用,导致两个Test对象无法被回收。
+在上述代码中,a 与 b 引用的对象实例互相持有了对象的引用,因此当我们把对 a 对象与 b 对象的引用去除之后,由于两个对象还存在互相之间的引用,导致两个 Test 对象无法被回收。
### 2. 可达性分析算法
@@ -214,7 +214,7 @@ obj = null;
```java
Object obj = new Object();
-PhantomReference