Skip to content

Commit fbaac05

Browse files
committed
[docs add]Java 17 新特性
1 parent 29b7417 commit fbaac05

File tree

8 files changed

+361
-191
lines changed

8 files changed

+361
-191
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,8 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle
122122
- [Java 10 新特性概览](./docs/java/new-features/java10.md)
123123
- [Java 11 新特性概览](./docs/java/new-features/java11.md)
124124
- [Java 12~13 新特性概览](./docs/java/new-features/java12-13.md)
125-
- [Java 14~15 新特性概览](./docs/java/new-features/java14-15.md)
125+
- [Java 14 新特性概览](./docs/java/new-features/java14.md)
126+
- [Java 15 新特性概览](./docs/java/new-features/java15.md)
126127
- [Java 16 新特性概览](./docs/java/new-features/java16.md)
127128
- [Java 18 新特性概览](./docs/java/new-features/java18.md)
128129
- [Java 19 新特性概览](./docs/java/new-features/java19.md)

docs/home.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,10 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle
126126
- [Java 10 新特性概览](./java/new-features/java10.md)
127127
- [Java 11 新特性概览](./java/new-features/java11.md)
128128
- [Java 12~13 新特性概览](./java/new-features/java12-13.md)
129-
- [Java 14~15 新特性概览](./java/new-features/java14-15.md)
129+
- [Java 14 新特性概览](./java/new-features/java14.md)
130+
- [Java 15 新特性概览](./java/new-features/java15.md)
130131
- [Java 16 新特性概览](./java/new-features/java16.md)
132+
- [Java 17 新特性概览](./java/new-features/java17.md)
131133
- [Java 18 新特性概览](./java/new-features/java18.md)
132134
- [Java 19 新特性概览](./java/new-features/java19.md)
133135

docs/java/new-features/java14.md

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
---
2+
title: Java 14 新特性概览
3+
category: Java
4+
tag:
5+
- Java新特性
6+
---
7+
8+
## 空指针异常精准提示
9+
10+
通过 JVM 参数中添加`-XX:+ShowCodeDetailsInExceptionMessages`,可以在空指针异常中获取更为详细的调用信息,更快的定位和解决问题。
11+
12+
```java
13+
a.b.c.i = 99; // 假设这段代码会发生空指针
14+
```
15+
16+
Java 14 之前:
17+
18+
```java
19+
Exception in thread "main" java.lang.NullPointerException
20+
at NullPointerExample.main(NullPointerExample.java:5)
21+
```
22+
23+
Java 14 之后:
24+
25+
```java
26+
// 增加参数后提示的异常中很明确的告知了哪里为空导致
27+
Exception in thread "main" java.lang.NullPointerException:
28+
Cannot read field 'c' because 'a.b' is null.
29+
at Prog.main(Prog.java:5)
30+
```
31+
32+
## switch 的增强(转正)
33+
34+
Java12 引入的 switch(预览特性)在 Java14 变为正式版本,不需要增加参数来启用,直接在 JDK14 中就能使用。
35+
36+
Java12 为 switch 表达式引入了类似 lambda 语法条件匹配成功后的执行块,不需要多写 break ,Java13 提供了 `yield` 来在 block 中返回值。
37+
38+
```java
39+
String result = switch (day) {
40+
case "M", "W", "F" -> "MWF";
41+
case "T", "TH", "S" -> "TTS";
42+
default -> {
43+
if(day.isEmpty())
44+
yield "Please insert a valid day.";
45+
else
46+
yield "Looks like a Sunday.";
47+
}
48+
49+
};
50+
System.out.println(result);
51+
```
52+
53+
## 预览新特性
54+
55+
### record 关键字
56+
57+
`record` 关键字可以简化 **数据类**(一个 Java 类一旦实例化就不能再修改)的定义方式,使用 `record` 代替 `class` 定义的类,只需要声明属性,就可以在获得属性的访问方法,以及 `toString()``hashCode()`, `equals()`方法
58+
59+
类似于使用 `class` 定义类,同时使用了 lombok 插件,并打上了`@Getter,@ToString,@EqualsAndHashCode`注解
60+
61+
```java
62+
/**
63+
* 这个类具有两个特征
64+
* 1. 所有成员属性都是final
65+
* 2. 全部方法由构造方法,和两个成员属性访问器组成(共三个)
66+
* 那么这种类就很适合使用record来声明
67+
*/
68+
final class Rectangle implements Shape {
69+
final double length;
70+
final double width;
71+
72+
public Rectangle(double length, double width) {
73+
this.length = length;
74+
this.width = width;
75+
}
76+
77+
double length() { return length; }
78+
double width() { return width; }
79+
}
80+
/**
81+
* 1. 使用record声明的类会自动拥有上面类中的三个方法
82+
* 2. 在这基础上还附赠了equals(),hashCode()方法以及toString()方法
83+
* 3. toString方法中包括所有成员属性的字符串表示形式及其名称
84+
*/
85+
record Rectangle(float length, float width) { }
86+
```
87+
88+
### 文本块
89+
90+
Java14 中,文本块依然是预览特性,不过,其引入了两个新的转义字符:
91+
92+
- `\` : 表示行尾,不引入换行符
93+
- `\s` :表示单个空格
94+
95+
```java
96+
String str = "凡心所向,素履所往,生如逆旅,一苇以航。";
97+
98+
String str2 = """
99+
凡心所向,素履所往, \
100+
生如逆旅,一苇以航。""";
101+
System.out.println(str2);// 凡心所向,素履所往, 生如逆旅,一苇以航。
102+
String text = """
103+
java
104+
c++\sphp
105+
""";
106+
System.out.println(text);
107+
//输出:
108+
java
109+
c++ php
110+
```
111+
112+
### instanceof 增强
113+
114+
依然是**预览特性** ,Java 12 新特性中介绍过。
115+
116+
## Java14 其他特性
117+
118+
- 从 Java11 引入的 ZGC 作为继 G1 过后的下一代 GC 算法,从支持 Linux 平台到 Java14 开始支持 MacOS 和 Window(个人感觉是终于可以在日常开发工具中先体验下 ZGC 的效果了,虽然其实 G1 也够用)
119+
- 移除了 CMS(Concurrent Mark Sweep) 垃圾收集器(功成而退)
120+
- 新增了 jpackage 工具,标配将应用打成 jar 包外,还支持不同平台的特性包,比如 linux 下的`deb``rpm`,window 平台下的`msi``exe`
Lines changed: 16 additions & 140 deletions
Original file line numberDiff line numberDiff line change
@@ -1,129 +1,11 @@
11
---
2-
title: Java 14 ~ 15 新特性概览
2+
title: Java 15 新特性概览
33
category: Java
44
tag:
55
- Java新特性
66
---
77

8-
## Java14
9-
10-
### 空指针异常精准提示
11-
12-
通过 JVM 参数中添加`-XX:+ShowCodeDetailsInExceptionMessages`,可以在空指针异常中获取更为详细的调用信息,更快的定位和解决问题。
13-
14-
```java
15-
a.b.c.i = 99; // 假设这段代码会发生空指针
16-
```
17-
18-
Java 14 之前:
19-
20-
```java
21-
Exception in thread "main" java.lang.NullPointerException
22-
at NullPointerExample.main(NullPointerExample.java:5)
23-
```
24-
25-
Java 14 之后:
26-
27-
```java
28-
// 增加参数后提示的异常中很明确的告知了哪里为空导致
29-
Exception in thread "main" java.lang.NullPointerException:
30-
Cannot read field 'c' because 'a.b' is null.
31-
at Prog.main(Prog.java:5)
32-
```
33-
34-
### switch 的增强(转正)
35-
36-
Java12 引入的 switch(预览特性)在 Java14 变为正式版本,不需要增加参数来启用,直接在 JDK14 中就能使用。
37-
38-
Java12 为 switch 表达式引入了类似 lambda 语法条件匹配成功后的执行块,不需要多写 break ,Java13 提供了 `yield` 来在 block 中返回值。
39-
40-
```java
41-
String result = switch (day) {
42-
case "M", "W", "F" -> "MWF";
43-
case "T", "TH", "S" -> "TTS";
44-
default -> {
45-
if(day.isEmpty())
46-
yield "Please insert a valid day.";
47-
else
48-
yield "Looks like a Sunday.";
49-
}
50-
51-
};
52-
System.out.println(result);
53-
```
54-
55-
### 预览新特性
56-
57-
#### record 关键字
58-
59-
`record` 关键字可以简化 **数据类**(一个 Java 类一旦实例化就不能再修改)的定义方式,使用 `record` 代替 `class` 定义的类,只需要声明属性,就可以在获得属性的访问方法,以及 `toString()``hashCode()`, `equals()`方法
60-
61-
类似于使用 `class` 定义类,同时使用了 lombok 插件,并打上了`@Getter,@ToString,@EqualsAndHashCode`注解
62-
63-
```java
64-
/**
65-
* 这个类具有两个特征
66-
* 1. 所有成员属性都是final
67-
* 2. 全部方法由构造方法,和两个成员属性访问器组成(共三个)
68-
* 那么这种类就很适合使用record来声明
69-
*/
70-
final class Rectangle implements Shape {
71-
final double length;
72-
final double width;
73-
74-
public Rectangle(double length, double width) {
75-
this.length = length;
76-
this.width = width;
77-
}
78-
79-
double length() { return length; }
80-
double width() { return width; }
81-
}
82-
/**
83-
* 1. 使用record声明的类会自动拥有上面类中的三个方法
84-
* 2. 在这基础上还附赠了equals(),hashCode()方法以及toString()方法
85-
* 3. toString方法中包括所有成员属性的字符串表示形式及其名称
86-
*/
87-
record Rectangle(float length, float width) { }
88-
```
89-
90-
#### 文本块
91-
92-
Java14 中,文本块依然是预览特性,不过,其引入了两个新的转义字符:
93-
94-
- `\` : 表示行尾,不引入换行符
95-
- `\s` :表示单个空格
96-
97-
```java
98-
String str = "凡心所向,素履所往,生如逆旅,一苇以航。";
99-
100-
String str2 = """
101-
凡心所向,素履所往, \
102-
生如逆旅,一苇以航。""";
103-
System.out.println(str2);// 凡心所向,素履所往, 生如逆旅,一苇以航。
104-
String text = """
105-
java
106-
c++\sphp
107-
""";
108-
System.out.println(text);
109-
//输出:
110-
java
111-
c++ php
112-
```
113-
114-
#### instanceof 增强
115-
116-
依然是**预览特性** ,Java 12 新特性中介绍过。
117-
118-
### Java14 其他特性
119-
120-
- 从 Java11 引入的 ZGC 作为继 G1 过后的下一代 GC 算法,从支持 Linux 平台到 Java14 开始支持 MacOS 和 Window(个人感觉是终于可以在日常开发工具中先体验下 ZGC 的效果了,虽然其实 G1 也够用)
121-
- 移除了 CMS(Concurrent Mark Sweep) 垃圾收集器(功成而退)
122-
- 新增了 jpackage 工具,标配将应用打成 jar 包外,还支持不同平台的特性包,比如 linux 下的`deb``rpm`,window 平台下的`msi``exe`
123-
124-
## Java15
125-
126-
### CharSequence
8+
## CharSequence
1279

12810
`CharSequence` 接口添加了一个默认方法 `isEmpty()` 来判断字符序列为空,如果是则返回 true。
12911

@@ -135,7 +17,7 @@ public interface CharSequence {
13517
}
13618
```
13719

138-
### TreeMap
20+
## TreeMap
13921

14022
`TreeMap` 新引入了下面这些方法:
14123

@@ -145,7 +27,7 @@ public interface CharSequence {
14527
- `compute()`
14628
- `merge()`
14729

148-
### ZGC(转正)
30+
## ZGC(转正)
14931

15032
Java11 的时候 ,ZGC 还在试验阶段。
15133

@@ -159,7 +41,7 @@ Java11 的时候 ,ZGC 还在试验阶段。
15941
$ java -XX:+UseZGC className
16042
```
16143

162-
### EdDSA(数字签名算法)
44+
## EdDSA(数字签名算法)
16345

16446
新加入了一个安全性和性能都更强的基于 Edwards-Curve Digital Signature Algorithm (EdDSA)实现的数字签名算法。
16547

@@ -186,25 +68,26 @@ System.out.println(encodedString);
18668
0Hc0lxxASZNvS52WsvnncJOH/mlFhnA8Tc6D/k5DtAX5BSsNVjtPF4R4+yMWXVjrvB2mxVXmChIbki6goFBgAg==
18769
```
18870

189-
### 文本块(转正)
71+
## 文本块(转正)
19072

19173
在 Java 15 ,文本块是正式的功能特性了。
19274

193-
### 隐藏类(Hidden Classes)
75+
## 隐藏类(Hidden Classes)
19476

19577
隐藏类是为框架(frameworks)所设计的,隐藏类不能直接被其他类的字节码使用,只能在运行时生成类并通过反射间接使用它们。
19678

197-
### 预览新特性
79+
## 预览新特性
19880

199-
#### 密封类
81+
### 密封类
20082

201-
Java 15 对 Java 14 中引入的预览新特性进行了增强,主要是引入了一个新的概念 **密封类(Sealed Classes)**
83+
**密封类(Sealed Classes)** 是 Java 15 中的一个预览新特性。
20284

203-
密封类可以对继承或者实现它们的类进行限制
85+
没有密封类之前,在 Java 中如果想让一个类不能被继承和修改,我们可以使用`final` 关键字对类进行修饰。不过,这种方式不太灵活,直接把一个类的继承和修改渠道给堵死了
20486

205-
比如抽象类 `Person` 只允许 `Employee``Manager` 继承
87+
密封类可以对继承或者实现它们的类进行限制,这样这个类就只能被指定的类继承
20688

20789
```java
90+
// 抽象类 Person 只允许 Employee 和 Manager 继承。
20891
public abstract sealed class Person
20992
permits Employee, Manager {
21093

@@ -226,13 +109,13 @@ public non-sealed class Manager extends Person {
226109

227110
如果允许扩展的子类和封闭类在同一个源代码文件里,封闭类可以不使用 permits 语句,Java 编译器将检索源文件,在编译期为封闭类添加上许可的子类。
228111

229-
#### instanceof 模式匹配
112+
### instanceof 模式匹配
230113

231114
Java 15 并没有对此特性进行调整,继续预览特性,主要用于接受更多的使用反馈。
232115

233116
在未来的 Java 版本中,Java 的目标是继续完善 `instanceof` 模式匹配新特性。
234117

235-
### Java15 其他新特性
118+
## Java15 其他新特性
236119

237120
- **Nashorn JavaScript 引擎彻底移除** :Nashorn 从 Java8 开始引入的 JavaScript 引擎,Java9 对 Nashorn 做了些增强,实现了一些 ES6 的新特性。在 Java 11 中就已经被弃用,到了 Java 15 就彻底被删除了。
238121
- **DatagramSocket API 重构**
@@ -257,11 +140,4 @@ Java 15 并没有对此特性进行调整,继续预览特性,主要用于接
257140

258141
整体优化的方向是**高效,低时延的垃圾回收表现**
259142

260-
对于日常的应用开发者可能比较关注新的语法特性,但是从一个公司角度来说,在考虑是否升级 Java 平台时更加考虑的是**JVM 运行时的提升**
261-
262-
## 参考
263-
264-
- Oracle Java14 record <https://docs.oracle.com/en/java/javase/14/language/records.html>
265-
- java14-features <https://www.techgeeknext.com/java/java14-features>
266-
- Java 14 Features : <https://www.journaldev.com/37273/java-14-features>
267-
- What is new in Java 15: https://mkyong.com/java/what-is-new-in-java-15/
143+
对于日常的应用开发者可能比较关注新的语法特性,但是从一个公司角度来说,在考虑是否升级 Java 平台时更加考虑的是**JVM 运行时的提升**

0 commit comments

Comments
 (0)