Java17新特性
约 927 字大约 3 分钟
2025-02-24
1.前言
JDK17是继 JDK8 和 JDK11 之后的一个最新支持稳定版本
- Spring6 和 SpringBoot3 最低支持 JDK17 ,不支持 JDK8;
- JDK17 增加了文本块、switch类型匹配、密封类 sealed class ,彻底删除了 AOT 和 JIT 编译器
2.Java17新特性
2.1 文本块
在Java17之前的版本里,当定义一个字符串,比如一个JSON数据:
public void lowVersion() {
String text = "{\n" +
" \"name\": \"Java\",\n" +
" \"age\": 18,\n" +
" \"address\": \"北京市\"\n" +
"}";
System.out.println(text);
}
这种方式定义具有几个问题:
- 双引号需要进行转义;
- 为了字符串的可读性需要通过+号连接;
Java17新增的文本块语法,通过三个双引号可以定义一个文本块,并且结束的三个双引号不能和开始的在同一行,可读性更好
private void highVersion() {
String text = """
{
"name": "小黑",
"age": 18,
"address": "北京市"
}
""";
System.out.println(text);
}
输出结果为:
{
"name": "小黑",
"age": 18,
"address": "北京市"
}
2.2 switch表达式
在 JDK17 之前版本里,swith没有返回值,每个 case 都需要加上 break ,代码冗余,如下
private static void lowVesion(Fruit fruit) {
switch (fruit) {
case APPLE, PEAR:
System.out.println("普通水果");
break;
case MANGO, AVOCADO:
System.out.println("进口水果");
break;
default:
System.out.println("未知水果");
}
}
JDK17 版本之后,将冒号(:)替换为箭头(->),并且switch表达式默认不会失败,所以不需要 break
private static void withSwitchExpression(Fruit fruit) {
switch (fruit) {
case APPLE, PEAR -> System.out.println("普通水果");
case MANGO, AVOCADO -> System.out.println("进口水果");
default -> System.out.println("未知水果");
}
}
同时,switch表达式也可以返回一个值,如下:
private static void withReturnValue(Fruit fruit) {
String text = switch (fruit) {
case APPLE, PEAR -> "普通水果";
case MANGO, AVOCADO -> "进口水果";
default -> "未知水果";
};
System.out.println(text);
}
补充:如果需要在 case 里面做多件事情,在返回值之前进行打印挫折,可以通过大括号来作为 case 块,最后的返回值使用关键字 yield 进行返回
private static void withYield(Fruit fruit) {
String text = switch (fruit) {
case APPLE, PEAR -> {
System.out.println("给的水果是: " + fruit);
yield "普通水果";
}
case MANGO, AVOCADO -> "进口水果";
default -> "未知水果";
};
System.out.println(text);
}
2.3 移除 AOT 和 JIT 编译器
在 JDK 17 中,Java 官方决定移除 AOT(Ahead-Of-Time)和 JIT(Just-In-Time)编译器
- AOT 编译器的使用率较低:尽管 AOT 编译器(允许在应用程序启动之前进行编译)最初被提出作为提升启动速度和减少运行时编译的一个解决方案,但实际上,很多开发者和应用程序并没有广泛采用它。性能提升不如预期,因此在 JDK 17 中被移除
- 技术复杂性和维护成本:AOT 编译器的开发和维护需要额外的精力,同时也增加了 JDK 的复杂度。因为 AOT 和 JIT 编译器都试图做类似的事情,在 JDK 17 中移除 AOT 可以减少重复的功能和维护负担。
2.4 新增伪随机数生成器:RandomGenerator
在 JDK 17 中,Java 引入了新的伪随机数生成器接口 RandomGenerator
。它提供了比传统 java.util.Random
更加灵活和强大的功能。新的 API 提供了更广泛的随机数生成选项,包括多种算法和更高效的实现。
特性
- 支持不同的随机数生成算法。
- 提供更好的性能和可扩展性。
- 更容易与现有的随机数生成器进行交互。
import java.util.random.RandomGenerator;
RandomGenerator generator = RandomGenerator.of("L64X128MixRandom");
int randomInt = generator.nextInt();
2.5 废弃 Applet
在 JDK 17 中,Applet
API 被正式标记为废弃。Applet
是一种过时的技术,它用于在浏览器中运行小型 Java 应用程序。现代 Web 技术,如 HTML5、JavaScript、以及各种前端框架,已经取代了 Applet
的功能。