Java 14(2020年3月发布)是一个非LTS版本,引入了多项新特性,主要包括以下几个重要功能:
1. Switch表达式(正式版)
- 在Java 12和13中作为预览特性,现在成为正式功能
- 使用
->箭头语法,无需break - 支持多值匹配和返回值
java
// 传统switch
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);
}
// 返回值的switch表达式
int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};
2. 预览特性:记录(Records)
- 简洁的数据载体类
- 自动生成构造器、getters、equals、hashCode、toString
java
public record Point(int x, int y) { }
// 等同于传统写法:
public final class Point {
private final int x;
private final int y;
// 自动生成所有方法
}
3. 预览特性:模式匹配instanceof
- 简化类型检查和转换
java
// 传统写法
if (obj instanceof String) {
String s = (String) obj;
// 使用s
}
// Java 14新写法
if (obj instanceof String s) {
// 直接使用s
System.out.println(s.length());
}
4. 文本块(第二预览)
- 改进的多行字符串支持
- 添加了两个新的转义序列
java
String html = """
<html>
<body>
<p>Hello, World</p>
</body>
</html>
""";
5. 有用的NullPointerExceptions
- 更详细的NullPointerException错误信息
- 明确指出哪个变量为null
java
a.b.c.i = 99;
// 旧版本错误:NullPointerException
// Java 14错误:Cannot read field "c" because "a.b" is null
6. 打包工具(正式版)
- 创建独立的应用程序包
- 支持Windows MSI、macOS PKG、Linux DEB/RPM
bash
jpackage --name myapp --input lib --main-jar myapp.jar
7. 其他改进
- G1垃圾收集器改进:并行完整GC
- ZGC改进:支持macOS和Windows
- 外部内存访问API(孵化器):安全的堆外内存操作
- NUMA感知内存分配
8. 弃用和移除
- 移除了CMS(Concurrent Mark Sweep)垃圾收集器
- 弃用ParallelScavenge + SerialOld GC组合
- 弃用Solaris和SPARC端口
使用新特性
java
// 综合示例:Record + Pattern Matching
record Person(String name, int age) {}
public void process(Object obj) {
if (obj instanceof Person p && p.age() > 18) {
System.out.println(p.name() + "是成年人");
}
}
Java 14的这些特性显著提升了开发效率和代码可读性,特别是Records和模式匹配为后续版本的功能奠定了基础。