Java - JDK 14
JDK 14 新特性
2020年3月17日,正式发布 JDK 14,新增16项新特性
新的语言特性
新的语言特性有7项
正式功能
Switch(JEP 361)
扩展 switch 表达式主要体现在两个方面
case L -> 标签
不带有贯穿功能,可以忽略 break,需要大括号
可使用逗号分割多个常量
局部变量仅作用于 case(旧版作用于 swtich)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25// old
switch(day) {
// 贯穿效果
case MON:
case TUE:
case WEN:
String s = "";
System.out.println("upper day");
break;
case THU:
case FRI:
String s = "a"; // 重复定义
System.out.println("lower day");
case SAT:
case SUN:
System.out.println("Weekend");
}
// new
switch(day) {
// 无贯穿
case SAT, SUN -> {System.out.println("Weekend"); String s = "v";}
case MON, TUE, WEN -> {System.out.println("upper part"); String s = "a";} // 不会报错
case THU, FRI -> System.out.pritnln("lower part");
}扩展 switch 作为表达式
1
2
3
4
5System.out.println(switch(day) {
case MON, TUE, WEN -> "upper day";
case THU, FRI -> "lower day";
case SAT, SUN -> "Weekend";
});扩展 switch 赋值给变量
1
2
3
4
5
6String text = swtch(day) {
case MON, TUE, WEN -> "upper day";
case THU, FRI -> "lower day";
case SAT, SUN -> "Weekend";
};
System.out.println(text);switch 新增 yield 语句
类似于 return,给这条 case 语句返回一个值
1
2
3
4
5
6
7
8
9
10
11
12
13day = Weekday.SAT;
int x = switch(day) {
case MON, TUE, WEN -> "upper day";
case THU, FRI -> "lower day";
case SAT, SUN -> {
// 生成[0, 10)范围内的随机整数
int rnd = (int)(Math.random() * 10);
System.out.pritnln("rnd" + rnd);
// 通过 yiedl 产生一个新值
yield rnd;
}
};
System.out.println("x = " + x); // 此处的值为 yield 返回的值
有好的空指针异常(JEP 358)
早期空指针异常只显示错误行数,无法判断诸如
car.engine.power
中哪一个出错JDK 14 中可以开启参数:
-XX:+ShowCodeDetailsInExceptionMessages
可以更好地指定哪个地方出现异常
非易失性映射字节缓冲区(JEP 352)
新增特定 JDK 的文件映射模式,可以使用 FileChannel 创建引用非易失性存储器的 MappedByteBuffer
预览功能
Record(JEP 359)
提供了一种紧凑的语法来声明类,可以看作新类型,类似于枚举,只需要使用 record 定义名称及它的属性即可
1
record Person(String name, int age) {}
系统会自动生成 Person 的标准成员:
- Person 中的每一个属性都定义为
private final
- 每个属性都提供公共的 getter 方法
- 公共的构造方法,参数列表与声明相同
- 生成 equals()、hashCode() 方法实现
- 生成 toString() 方法的重写
注意:record 不能继承;record 类隐含的是 final 类,也不能被继承
- Person 中的每一个属性都定义为
instanceof 模式匹配(JEP 305)
通过 instanceof 运算符进行模式匹配
1
2
3
4
5
6
7
8
9
10
11// old
if (obj instanceof Integer) {
Integer ii = (Integer)obj;
System.out.println(ii);
}
// new
// 若 obj 判断为 Interger 类型可直接绑定给 ii
if (obj instanceof Integer ii) {
System.out.println(ii);
}文本块(JEP 368)
在 JDK 13 中引入了文本块的预览,在 JDK 14 中进行二次预览,为了更方便的对 HTML、XML、JSON、SQL 这些字符串进行更好的阅读与维护
使用三个引号开始
1
2
3
4
5
6
7
8
9String html = """
<htm>
<body>
<p> vv </p>
</body>
</html>
""";
System.out.println(html);外部存储器 API(JEP 370)
外部存储器 API 主要包含三个类:MemorySegment、MemoryAddress、MemoryLayout
该功能作为孵化器模块引用(让更多的 Java 人员参与测试与反馈)
功能发布顺序:孵化 -> 预览 -> 发布
垃圾回收修改
G1 的 NUMA 内存分配优化(JEP 345)
NUMA(non-uniform memory access):非统一的内存访问
内存插槽距离大不相同,实际中传输会有延迟
JFR 事件流(JEP 349)
JDK flight Recorder:对数据进行连续的监视
移除 CMS 垃圾收集器(JEP 363)
弃用 Prllel Scvenge 和 Serial Old 垃圾收集算法(JEP 366)
移除顺序:弃用 -> 移除
MacOS 系统上的 ZGC 实验(JEP 364)
Windows 系统上的 ZGC 实验(JEP 365)
移除包和功能
- 弃用 Solaris 和 SPARC 端口(JEP 362)
- 移除 Pack200(JEP 367)
新工具
打包工具(JEP 343)
想创建一个用于打包的独立的 Java 工具,处于孵化阶段