JDK17新特性
1. Switch Expressions with Pattern Matching(模式匹配增强)(JEP 406)
模式匹配的switch语句和表达式得到了增强,增加了类型模式和守卫模式。
public class SwitchPatternMatching {
public static void main(String[] args) {
Object obj = "Hello";
switch (obj) {
case String s when s.length() > 5 -> System.out.println("Long string: " + s);
case String s -> System.out.println("String: " + s);
case Integer i -> System.out.println("Integer: " + i);
default -> System.out.println("Other type");
}
}
}
2. Sealed Classes(密封类)(JEP 409)
密封类允许类的作者控制哪些其他类或接口可以扩展或实现它们。
public sealed class Shape permits Circle, Rectangle {
public abstract double area();
}
final class Circle extends Shape {
private final double radius;
public Circle(double radius) { this.radius = radius; }
@Override public double area() { return Math.PI * radius * radius; }
}
non-sealed class Rectangle extends Shape {
private final double width, height;
public Rectangle(double width, double height) { this.width = width; this.height = height; }
@Override public double area() { return width * height; }
}
public class SealedClassDemo {
public static void main(String[] args) {
Shape shape = new Circle(5);
System.out.println("Area: " + shape.area());
}
}
3. Vector API(孵化器第三版)(JEP 414)
虽然仍是孵化器状态,但Vector API提供了矢量化操作以提高性能。
import jdk.incubator.vector.FloatVector;
public class VectorAPIDemo {
public static void main(String[] args) {
FloatVector vectorA = FloatVector.fromArray(FloatVector.SPECIES_256, new float[]{1f, 2f, 3f, 4f}, 0);
FloatVector vectorB = FloatVector.fromArray(FloatVector.SPECIES_256, new float[]{5f, 6f, 7f, 8f}, 0);
FloatVector result = vectorA.add(vectorB);
result.intoArray(new float[4], 0);
// 打印或使用结果
}
}
4. 外部函数和内存API(孵化器第二版)(JEP 412)
允许Java程序安全有效地访问外部内存和调用外部函数。
5. 文本块(Text Blocks)(稳定版)
虽然不是JDK 17的新特性,但自JDK 13引入并在此版本中保持稳定,便于多行字符串的使用。
public class TextBlocksDemo {
public static void main(String[] args) {
String html = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
System.out.println(html);
}
}
6. 弃用安全管理器(JEP 411)
标志着Java平台逐步减少对旧安全模型的依赖。
7. 特定于上下文的反序列化过滤器(JEP 415)
增强安全性,允许应用程序控制对象反序列化的上下文,防止不安全的反序列化操作。
8.增强的伪随机数生成器
Java 17 为伪随机数生成器 (pseudorandom number generator,PRNG,又称为确定性随机位生成器)增加了新的接口类型和实现,使得开发者更容易在应用程序中互换使用各种 PRNG 算法。
RandomGeneratorFactory<RandomGenerator> l128X256MixRandom = RandomGeneratorFactory.of("L128X256MixRandom");
// 使用时间戳作为随机数种子
RandomGenerator randomGenerator = l128X256MixRandom.create(System.currentTimeMillis());
// 生成随机数
randomGenerator.nextInt(10);
9. 增强的Switch表达式
虽然模式匹配的Switch在JDK 14和15中作为预览特性出现,JDK 17中进一步稳定和完善了这一特性,使得代码更加清晰和简洁。
static String formatterPatternSwitch(Object o) {
return switch (o) {
case Integer i -> String.format("int %d", i);
case Long l -> String.format("long %d", l);
case Double d -> String.format("double %f", d);
case String s -> String.format("String %s", s);
default -> o.toString();
};
}
10. Unicode 13.0
JDK 17支持Unicode 13.0标准,这意味着Java能够识别和处理更多字符集,增强了国际化应用的支持。
11. 移除实验性的AOT和JIT编译器(JEP 410)
表明Oracle对即时编译器(如HotSpot)的持续信任,同时简化了代码库。
12. 移除RMI激活机制(JEP 407)
由于安全性和维护问题,RMI激活机制被移除,鼓励使用更现代的服务发现机制。
13. 增强的安全性
包括弃用弱加密算法、改进的TLS协议支持等,确保Java应用能遵循最新的安全实践。
14. 多平台支持的改进
持续优化对不同操作系统和硬件架构的支持,包括对Apple Silicon处理器的原生支持。
15. 多线程并发库的改进
虽然没有具体的代码示例,JDK 17对并发库的内部进行了优化,提升了多线程应用的性能和稳定性。
16. 模块系统改进
JDK的模块系统(Project Jigsaw)得到进一步的增强和调整,以支持更细粒度的模块管理和更好的兼容性。
17. 性能数据采集和展示的改进
帮助开发者更好地监控和理解应用程序的运行时性能,虽然具体API使用可能因应用而异,但通常涉及使用Java Flight Recorder(JFR)等工具。
18. 垃圾收集器的持续优化
虽然不是直接的新特性,但JDK 17继续对ZGC和Shenandoah等垃圾收集器进行优化,减少了暂停时间和提高了整体效率。
19. JavaFX 17集成
虽然不是JDK的一部分,但JavaFX 17与JDK 17一同发布,带来了UI库的更新和改进。
20. JEP 356:强封装JDK内部元素
虽然此JEP在JDK 16中引入,但在JDK 17中继续得到强调,它限制了对JDK内部API的访问,推动开发者使用标准API,从而提高代码的未来兼容性。