Java 8 无疑是一个具有重大意义的版本,它带来了一系列影响深远的特性,其中 Lambda 表达式和 Stream API 最为突出。Lambda 表达式为 Java 引入了函数式编程风格,让代码变得更加简洁和灵活。
Java 8 还引入了函数式接口、Optional 类来处理空指针异常、新的日期时间 API 等,这些特性极大地提升了开发效率和代码质量。
相较于 Java 8,Java 17 在性能、语言特性、安全性等方面都有了显著的改进和增强,接下来就来看看 Java 17 具体带来了哪些让人眼前一亮的新特性。
一、Java17简介
Java 17 于 2021 年 9 月发布,作为长期支持(LTS)版本,它将获得 Oracle 和其他供应商长时间的支持与维护。
对于一直使用 Java 8 的开发者而言,Java 17 带来的新特性宛如一场及时雨,能极大地提升开发效率,优化代码质量。
下面就为大家详细介绍 Java 17 中那些不容错过的新特性。
二、新特性
1.密封类 sealed 关键字
密封类是 Java 17 引入的重要语言特性,它通过限制类的继承关系,使得代码的结构更加清晰和可控。在密封类出现之前,一个类要么是可以被任意类继承(非 final 类),要么是完全禁止继承(final 类) ,而密封类提供了一种中间状态。
通过使用 sealed 关键字声明类,并使用 permits 关键字指定允许的子类,我们可以精确地控制哪些类可以继承该密封类。
/**
* 定义一个接口Shape,只允许Circle和Rectangle实现它
*/
public sealed interface Shape permits Circle, Rectangle {
double area();
}
// Circle类实现Shape接口,声明为final,禁止继续被继承
public final class Circle implements Shape{
private final double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double area() {
return Math.PI * radius * radius;
}
}
// Rectangle类实现Shape接口,声明为sealed,还可以限制其继承关系
public sealed class Rectangle implements Shape permits Square{
private final double length;
private final double width;
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
@Override
public double area() {
return length * width;
}
}
// Square类继承Rectangle,声明为final
public final class Square extends Rectangle{
public Square(double side) {
super(side, side);
}
}
对于框架和库的开发者来说,密封类可以更好地控制类的继承体系,减少代码耦合性 。
2.Switch 模式匹配
Switch 模式匹配允许在 switch 语句中直接匹配对象的类型和值,通过新的语法结构,极大地简化了复杂的条件判断逻辑。
public static void main(String[] args) {
Object obj = "Hello, Java 17";
String result = switch (obj) {
case Integer i -> "这是一个整数: " + i;
case String s -> "这是一个普通字符串: " + s;
default -> "未知类型";
};
System.out.println(result);
}
3.字符串处理优化
文本块
在 Java 8 及以前,处理多行字符串需要使用转义字符,这使得代码的可读性较差。而文本块使用一对三个双引号(“”")来定义,其中的换行符、缩进等都会被保留
public static void main(String[] args) {
String html = """
<html>
<body>
<p>这是一个使用Java 17文本块的示例</p>
</body>
</html>
""";
System.out.println(html);
}
字符串拼接优化
在一些简单的字符串拼接场景下,编译器可以自动优化为使用 StringBuilder
public static void main(String[] args) {
String s1 = "Hello";
String s2 = "Java 17";
String result = s1 + " " + s2;
System.out.println(result);
}
4.增强的伪随机数生成器
提供新的API(如RandomGenerator)支持高质量随机数生成
public static void main(String[] args) {
RandomGenerator rng = RandomGeneratorFactory.of("L64X1024MixRandom").create();
System.out.println(rng.nextInt());
}
5.HTTP/2 支持
Java 17 的java.net.http 包对 HTTP/2 协议提供了支持。HTTP/2 相较于 HTTP/1.1 有很多优势,如多路复用、头部压缩等,可以大大提高网络传输效率。在 Java 17 中,我们可以使用新的 HttpClient 来发送 HTTP/2 请求,并且支持异步请求。
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://www.example.com"))
.build();
CompletableFuture<HttpResponse<String>> future = client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
future.thenApply(HttpResponse::body)
.thenAccept(System.out::println)
.join();
}
三、垃圾回收器升级
G1 垃圾回收器优化
在 Java 17 中,G1(Garbage - First)垃圾回收器有了进一步的优化。G1 收集器以 Region 为单位进行内存回收,它会优先回收垃圾最多的 Region。在 Java 17 中,对 G1 的停顿预测模型进行了改进,使其能够更准确地预测垃圾回收的停顿时间。这对于一些对停顿时间敏感的应用程序来说非常重要,比如在线交易系统,更准确的停顿预测可以减少因垃圾回收导致的服务不可用时间,提升用户体验。
ZGC 垃圾回收器优化
ZGC(Z Garbage Collector)是一款低延迟的垃圾回收器,在 Java 17 中也得到了优化。ZGC 支持非常大的堆内存,并且能够实现亚毫秒级的停顿时间。它通过染色指针和读屏障等技术,实现了并发的垃圾回收,减少了垃圾回收对应用程序的影响。例如,在一些大数据处理和人工智能训练场景中,需要处理海量的数据,ZGC 的低延迟和大内存支持特性可以保证这些任务的高效执行。
Shenandoah 垃圾回收器优化
Shenandoah 垃圾回收器在 Java 17 中同样有优化改进。它致力于在高并发环境下,减少垃圾回收对应用程序吞吐量的影响。Shenandoah 通过与应用程序并发执行垃圾回收操作,使得应用程序在垃圾回收期间仍然能够保持较高的性能。在一些大型的分布式系统中,Shenandoah 的这种特性可以确保系统在长时间运行过程中始终保持良好的性能表现。