JDK 17作为Java的长期支持(LTS)版本,于2021年9月发布,带来了多项重要更新和改进。以下是JDK 17的主要新特性分类整理:
JDK 17对模式匹配进行了多项增强,使代码更加简洁易读:
java// 旧写法
if (obj instanceof String) {
String str = (String) obj;
System.out.println(str.toUpperCase());
}
// 新写法
if (obj instanceof String str) {
System.out.println(str.toUpperCase());
}
javaswitch (day) {
case MONDAY, FRIDAY -> System.out.println("Weekday");
case SATURDAY, SUNDAY -> System.out.println("Weekend");
default -> throw new IllegalArgumentException("Invalid day");
}
javarecord Point(int x, int y) {}
if (obj instanceof Point p) {
System.out.println("Point(" + p.x() + ", " + p.y() + ")");
}
密封类允许开发者限制哪些类可以继承或实现它们,提供更严格的访问控制:
javapublic sealed class Shape permits Circle, Rectangle, Square {
public abstract double area();
}
public final class Circle extends Shape { /* ... */ }
public final class Rectangle extends Shape { /* ... */ }
public final class Square extends Shape { /* ... */ }
密封类增强了代码安全性,促进更好的代码组织结构,并支持模式匹配。
文本块简化了多行字符串的编写,特别适合JSON、HTML、SQL等内容:
java// 旧写法
String html = "<html>\n" +
" <body>\n" +
" <p>Hello, world</p>\n" +
" </body>\n" +
"</html>";
// 新写法
String html = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
JDK 17为伪随机数生成器(PRNG)提供了新的接口和实现:
RandomGenerator
统一了所有PRNG的APIRandomGeneratorFactory
用于定位和构造PRNG实例javaRandomGenerator generator = RandomGeneratorFactory.of("L128X128MixRandom").create();
IntStream ints = generator.ints(50, 0, 10);
JDK 17提供了更详细的空指针异常信息,帮助开发者快速定位问题源头:
javapublic static void main(String[] args) {
try {
var arr = List.of(null);
String str = (String)arr.get(0);
str.length();
} catch (Exception e) {
e.printStackTrace(); // 会显示更详细的NPE信息
}
}
记录类型提供了一种简洁的方式来定义不可变的数据聚合:
javapublic record StudentRecord(Long stuId, String stuName, int stuAge,
String stuGender, String stuEmail) {
public StudentRecord {
System.out.println("构造函数");
}
}
JDK 17对垃圾收集器进行了多项改进:
bashjava -XX:+UseZGC -jar myapp.jar
bashjava -XX:+UseShenandoahGC -jar myapp.jar
JDK 17加强了内部API的封装,老版本直接访问内部类的方式不再可行,需要通过服务提供者机制访问。
提供与本地代码(如C/C++)交互的标准方式,支持操作非托管内存和调用C语言函数。
支持SIMD指令集,进行高性能并行计算,优化向量化操作。
支持同一主机上进程间的高效本地通信。
JDK 17是继Java 8以来最重要的LTS版本,Spring 6.x和Spring Boot 3.x最低支持Java 17。根据统计,Java 17的使用率在一年内增长了430%,已有超过9%的应用程序在生产中使用。
升级到JDK 17可以获得:
对于新项目,建议直接采用JDK 17;对于现有项目,可根据实际情况制定迁移计划。
特性类别 | 主要改进 | 相关JEP | 重要性 |
---|---|---|---|
语言特性 | 模式匹配、密封类、文本块 | JEP 406, 409 | ⭐⭐⭐⭐⭐ |
API改进 | 伪随机数、NPE增强、Records | JEP 356, 395 | ⭐⭐⭐⭐ |
JVM性能 | ZGC/Shenandoah增强 | JEP 376, 387 | ⭐⭐⭐⭐ |
本地交互 | 外部函数和内存API | JEP 412 | ⭐⭐⭐ |
移除功能 | Applet、RMI激活等 | JEP 398, 407 | ⭐⭐ |
JDK 17的新特性使Java语言更现代化,提高了开发效率和运行时性能,是企业应用升级的理想选择。