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 11210af18d8..918585a0d6e 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"
@@ -371,7 +371,7 @@ System.out.println(str3 == str5);//true
System.out.println(str4 == str5);//false
```
-
+
尽量避免多个字符串拼接,因为这样会重新创建对象。如果需要改变字符串的话,可以使用 StringBuilder 或者 StringBuffer。
diff --git "a/docs/java/jvm/pictures/java\345\206\205\345\255\230\345\214\272\345\237\237/\345\255\227\347\254\246\344\270\262\346\213\274\346\216\245-\345\270\270\351\207\217\346\261\240.drawio" "b/docs/java/jvm/pictures/java\345\206\205\345\255\230\345\214\272\345\237\237/\345\255\227\347\254\246\344\270\262\346\213\274\346\216\245-\345\270\270\351\207\217\346\261\240.drawio"
new file mode 100644
index 00000000000..764cc0be828
--- /dev/null
+++ "b/docs/java/jvm/pictures/java\345\206\205\345\255\230\345\214\272\345\237\237/\345\255\227\347\254\246\344\270\262\346\213\274\346\216\245-\345\270\270\351\207\217\346\261\240.drawio"
@@ -0,0 +1 @@
+7Vpdb6M4FP011j61AoMNPCZpZkYrrbRStZqZRxccsOLgDDhNMr9+bTAhfKSTtqG0melL8L3mYp9zbny5DXBmq93njKyTf0REOYBWtAPOHYDQti2sPrRlX1r8AJaGOGORmVQb7tlPaoyWsW5YRPPGRCkEl2zdNIYiTWkoGzaSZWLbnLYQvPnUNYlpx3AfEt61fmWRTMwuoFfbv1AWJ9WTbRyUnhWpJpud5AmJxPbI5MyBM8uEkOXVajejXINX4VLe9+mE97CwjKbynBuW6c/Zcu/fPOZp8vjfarvJ/57cmCiPhG/MhgHEXMWbLoQKq1Yt9wYK/GMjKsdNXhA1UROgs97VTnUV689cZnYVSS2pDFa6DBqHuDATmzSiepW2cm8TJun9moTau1WiUrZErrhxx5zkubk+IFoMllSGiRmYXdFM0t1JuOwDCUq9VKyozPZqirnBN7QZ3TqeGW9rFdiWsSVHCkDGRozw4kPkmht1Yeh5BlVwOKrQVVGF0dhUOcNR5V4VVcgfmyp3OKqc66LKHpsqNBxV8Kqoct2xqcI9VH0IJCFCTSitLpSOi7pQOtZQWHonZZ+vSfpy2dcWlQANd5UJZfwPlQmHMq3izxk7FfzB6WNpfLX0jV4fBAMdOo3sO8XgBzyK2gyi0ROwqlueOoxUGLbO6a9xFMrDpN6bOmMV1YzzmeAiK8I4EaH+Iiw5FUt65MGhTx8Wg59ePr6FrQOsp2yD2LvtOcKgjYaioKfNMEdgYgEfd7hQ25dN0JtopiKlLeiNiXAWp2oYKriosk81mCwkfGIcKxZF/BTLdT5ZPUSrTDTNKTu4DFlu0HptrcqKI6bcnkSBgyVKT4dBs3QHAg/MPTCZgQkGcxdMfTAtXPrCB/MA+B7wP4E5BlNbs/q7UuqgTv6hoMuqDfvzbzBi+/oR7W/ANJrodqnGWp8VLGwS1kaL7pj8Znz6+rsGWe2qHN3tDObFYG8G5UNp1Om4tvBVCxObLKRPbamcJ0kWU/mr4rnL1xEZ6ImzKKOcSPbYXG4fPeYJ/wpW1ASVfk69l1Uhym2au2qSO4Gg0wzkBK1AJQ6dQIVaDtt+hYD6uiSDCMh7MwWhMxXkj6qgdjVlv1RBsCVF/MYK6mvevFJBFxSDe6YYgnclBv9CYjjU6G8lhm576K8zaoaMqpcq8lBM0F8Ga72+YsVoCtDds6oFTh4on5JwGRc1wlGlvij+nlMfmH89mpWBA7rHQnwiKU5WE9ati3CDqOrYe6mQqiliscjpMNSe7lb9eV/uLRmx26AYj967tfs6Vh+7WnTO/Hq331W5iC9VLqK3Lhf7mmavVVCq1vSt0okeHGlID2sRFaPnq+idH/5tcXjoMuLAGF1IHGpY/5qlnF7/JsiZ/w8=
\ No newline at end of file
diff --git "a/docs/java/jvm/pictures/java\345\206\205\345\255\230\345\214\272\345\237\237/\345\255\227\347\254\246\344\270\262\346\213\274\346\216\245-\345\270\270\351\207\217\346\261\240.png" "b/docs/java/jvm/pictures/java\345\206\205\345\255\230\345\214\272\345\237\237/\345\255\227\347\254\246\344\270\262\346\213\274\346\216\245-\345\270\270\351\207\217\346\261\240.png"
new file mode 100644
index 00000000000..4c6f20e9508
Binary files /dev/null and "b/docs/java/jvm/pictures/java\345\206\205\345\255\230\345\214\272\345\237\237/\345\255\227\347\254\246\344\270\262\346\213\274\346\216\245-\345\270\270\351\207\217\346\261\240.png" differ
diff --git "a/docs/java/jvm/pictures/java\345\206\205\345\255\230\345\214\272\345\237\237/\345\255\227\347\254\246\344\270\262\346\213\274\346\216\245-\345\270\270\351\207\217\346\261\2402.png" "b/docs/java/jvm/pictures/java\345\206\205\345\255\230\345\214\272\345\237\237/\345\255\227\347\254\246\344\270\262\346\213\274\346\216\245-\345\270\270\351\207\217\346\261\2402.png"
deleted file mode 100644
index b680fb60204..00000000000
Binary files "a/docs/java/jvm/pictures/java\345\206\205\345\255\230\345\214\272\345\237\237/\345\255\227\347\254\246\344\270\262\346\213\274\346\216\245-\345\270\270\351\207\217\346\261\2402.png" and /dev/null differ
diff --git "a/docs/java/new-features/\344\270\200\346\226\207\345\270\246\344\275\240\347\234\213\351\201\215JDK9\345\210\26014\347\232\204\351\207\215\350\246\201\346\226\260\347\211\271\346\200\247.md" "b/docs/java/new-features/\344\270\200\346\226\207\345\270\246\344\275\240\347\234\213\351\201\215JDK9\345\210\26014\347\232\204\351\207\215\350\246\201\346\226\260\347\211\271\346\200\247.md"
index 4354d219507..552b03f0967 100644
--- "a/docs/java/new-features/\344\270\200\346\226\207\345\270\246\344\275\240\347\234\213\351\201\215JDK9\345\210\26014\347\232\204\351\207\215\350\246\201\346\226\260\347\211\271\346\200\247.md"
+++ "b/docs/java/new-features/\344\270\200\346\226\207\345\270\246\344\275\240\347\234\213\351\201\215JDK9\345\210\26014\347\232\204\351\207\215\350\246\201\346\226\260\347\211\271\346\200\247.md"
@@ -415,43 +415,133 @@ Consumer consumer = (String i) -> System.out.println(i);
## Java12
-### 增强 Switch
+### String
-- 传统的 switch 语法存在容易漏写 break 的问题,而且从代码整洁性层面来看,多个 break 本质也是一种重复
+Java 11 增加了两个的字符串处理方法,如以下所示。
-- Java12 提供了 swtich 表达式,使用类似 lambda 语法条件匹配成功后的执行块,不需要多写 break
+`indent()` 方法可以实现字符串缩进。
-- 作为预览特性加入,需要在`javac`编译和`java`运行时增加参数`--enable-preview`
+```java
+String text = "Java";
+// 缩进 4 格
+text = text.indent(4);
+System.out.println(text);
+text = text.indent(-10);
+System.out.println(text);
+```
- ```java
- switch (day) {
- case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
- case TUESDAY -> System.out.println(7);
- case THURSDAY, SATURDAY -> System.out.println(8);
- case WEDNESDAY -> System.out.println(9);
- }
- ```
+输出:
+
+```
+ Java
+Java
+```
+
+`transform()` 方法可以用来转变指定字符串。
+
+```java
+String result = "foo".transform(input -> input + " bar");
+System.out.println(result); // foo bar
+```
+
+### 文件比较
+
+Java 12 添加了以下方法来比较两个文件:
+
+```java
+public static long mismatch(Path path, Path path2) throws IOException
+```
+
+`mismatch()` 方法用于比较两个文件,并返回第一个不匹配字符的位置,如果文件相同则返回 -1L。
+
+代码示例(两个文件内容相同的情况):
+
+```java
+Path filePath1 = Files.createTempFile("file1", ".txt");
+Path filePath2 = Files.createTempFile("file2", ".txt");
+Files.writeString(filePath1, "Java 12 Article");
+Files.writeString(filePath2, "Java 12 Article");
+
+long mismatch = Files.mismatch(filePath1, filePath2);
+assertEquals(-1, mismatch);
+```
+
+代码示例(两个文件内容不相同的情况):
+
+```java
+Path filePath3 = Files.createTempFile("file3", ".txt");
+Path filePath4 = Files.createTempFile("file4", ".txt");
+Files.writeString(filePath3, "Java 12 Article");
+Files.writeString(filePath4, "Java 12 Tutorial");
+
+long mismatch = Files.mismatch(filePath3, filePath4);
+assertEquals(8, mismatch);
+```
### 数字格式化工具类
-- `NumberFormat` 新增了对复杂的数字进行格式化的支持
+`NumberFormat` 新增了对复杂的数字进行格式化的支持
- ```java
- NumberFormat fmt = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT);
- String result = fmt.format(1000);
- System.out.println(result); // 输出为 1K,计算工资是多少K更方便了。。。
- ```
+```java
+NumberFormat fmt = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT);
+String result = fmt.format(1000);
+ System.out.println(result); // 输出为 1K,计算工资是多少K更方便了。。。
+```
### Shenandoah GC
-- Redhat 主导开发的 Pauseless GC 实现,主要目标是 99.9% 的暂停小于 10ms,暂停与堆大小无关等
-- 和 Java11 开源的 ZGC 相比(需要升级到 JDK11 才能使用),Shenandoah GC 有稳定的 JDK8u 版本,在 Java8 占据主要市场份额的今天有更大的可落地性
+Redhat 主导开发的 Pauseless GC 实现,主要目标是 99.9% 的暂停小于 10ms,暂停与堆大小无关等
+
+和 Java11 开源的 ZGC 相比(需要升级到 JDK11 才能使用),Shenandoah GC 有稳定的 JDK8u 版本,在 Java8 占据主要市场份额的今天有更大的可落地性。
### G1 收集器提升
-- **Java12 为默认的垃圾收集器 G1 带来了两项更新:**
- - 可中止的混合收集集合:JEP344 的实现,为了达到用户提供的停顿时间目标,JEP 344 通过把要被回收的区域集(混合收集集合)拆分为强制和可选部分,使 G1 垃圾回收器能中止垃圾回收过程。 G1 可以中止可选部分的回收以达到停顿时间目标
- - 及时返回未使用的已分配内存:JEP346 的实现,增强 G1 GC,以便在空闲时自动将 Java 堆内存返回给操作系统
+Java12 为默认的垃圾收集器 G1 带来了两项更新:
+
+- **可中止的混合收集集合** :JEP344 的实现,为了达到用户提供的停顿时间目标,JEP 344 通过把要被回收的区域集(混合收集集合)拆分为强制和可选部分,使 G1 垃圾回收器能中止垃圾回收过程。 G1 可以中止可选部分的回收以达到停顿时间目标
+- **及时返回未使用的已分配内存** :JEP346 的实现,增强 G1 GC,以便在空闲时自动将 Java 堆内存返回给操作系统
+
+### 预览新特性
+
+作为预览特性加入,需要在`javac`编译和`java`运行时增加参数`--enable-preview` 。
+
+#### 增强 Switch
+
+传统的 `switch` 语法存在容易漏写 `break` 的问题,而且从代码整洁性层面来看,多个 break 本质也是一种重复
+
+Java12 提供了 `swtich` 表达式,使用类似 lambda 语法条件匹配成功后的执行块,不需要多写 break 。
+
+```java
+switch (day) {
+ case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
+ case TUESDAY -> System.out.println(7);
+ case THURSDAY, SATURDAY -> System.out.println(8);
+ case WEDNESDAY -> System.out.println(9);
+}
+```
+
+#### instanceof 模式匹配
+
+`instanceof` 主要在**类型强转前探测对象的具体类型**。
+
+之前的版本中,我们需要显示地对对象进行类型转换。
+
+```java
+Object obj = "我是字符串";
+if(obj instanceof String){
+ String str = (String) obj;
+ System.out.println(str);
+}
+```
+
+新版的 `instanceof` 可以在判断是否属于具体的类型同时完成转换。
+
+```java
+Object obj = "我是字符串";
+if(obj instanceof String str){
+ System.out.println(str);
+}
+```
## Java13
@@ -599,16 +689,7 @@ switch (day) {
### instanceof 增强
-- instanceof 主要在**类型强转前探测对象的具体类型**,然后执行具体的强转
-
-- 新版的 instanceof 可以在判断的是否属于具体的类型同时完成转换
-
-```java
-Object obj = "我是字符串";
-if(obj instanceof String str){
- System.out.println(str);
-}
-```
+依然是**预览特性** ,Java 12 新特性中介绍过。
### 其他特性
@@ -640,6 +721,7 @@ if(obj instanceof String str){
- Java 11 – Features and Comparison:
- Oracle Java12 ReleaseNote
- Oracle Java13 ReleaseNote
+- New Features in Java 12
- New Java13 Features
- Java13 新特性概述
- Oracle Java14 record