--- title: Java 17 新特性概览 category: Java tag: - Java新特性 --- Java 17 在 2021 年 9 月 14 日正式发布,是一个长期支持(LTS)版本。 下面这张图是 Oracle 官方给出的 Oracle JDK 支持的时间线。可以看得到,Java 17 最多可以支持到 2029 年 9 月份。 ![](https://img-blog.csdnimg.cn/4c1611fad59449edbbd6e233690e9fa7.png) Java 17 将是继 Java 8 以来最重要的长期支持(LTS)版本,是 Java 社区八年努力的成果。Spring 6.x 和 Spring Boot 3.x 最低支持的就是 Java 17。 这次更新共带来 14 个新特性: - [JEP 306:Restore Always-Strict Floating-Point Semantics(恢复始终严格的浮点语义)](https://openjdk.java.net/jeps/306) - [JEP 356:Enhanced Pseudo-Random Number Generators(增强的伪随机数生成器)](https://openjdk.java.net/jeps/356) - [JEP 382:New macOS Rendering Pipeline(新的 macOS 渲染管道)](https://openjdk.java.net/jeps/382) - [JEP 391:macOS/AArch64 Port(支持 macOS AArch64)](https://openjdk.java.net/jeps/391) - [JEP 398:Deprecate the Applet API for Removal(删除已弃用的 Applet API)](https://openjdk.java.net/jeps/398) - [JEP 403:Strongly Encapsulate JDK Internals(更强大的封装 JDK 内部元素)](https://openjdk.java.net/jeps/403) - [JEP 406:Pattern Matching for switch (switch 的类型匹配)](https://openjdk.java.net/jeps/406)(预览) - [JEP 407:Remove RMI Activation(删除远程方法调用激活机制)](https://openjdk.java.net/jeps/407) - [JEP 409:Sealed Classes(密封类)](https://openjdk.java.net/jeps/409)(转正) - [JEP 410:Remove the Experimental AOT and JIT Compiler(删除实验性的 AOT 和 JIT 编译器)](https://openjdk.java.net/jeps/410) - [JEP 411:Deprecate the Security Manager for Removal(弃用安全管理器以进行删除)](https://openjdk.java.net/jeps/411) - [JEP 412:Foreign Function & Memory API (外部函数和内存 API)](https://openjdk.java.net/jeps/412)(孵化) - [JEP 414:Vector(向量) API ](https://openjdk.java.net/jeps/417)(第二次孵化) - [JEP 415:Context-Specific Deserialization Filters](https://openjdk.java.net/jeps/415) 这里只对 356、398、413、406、407、409、410、411、412、414 这几个我觉得比较重要的新特性进行详细介绍。 相关阅读:[OpenJDK Java 17 文档](https://openjdk.java.net/projects/jdk/17/) 。 ## JEP 356:增强的伪随机数生成器 JDK 17 之前,我们可以借助 `Random`、`ThreadLocalRandom`和`SplittableRandom`来生成随机数。不过,这 3 个类都各有缺陷,且缺少常见的伪随机算法支持。 Java 17 为伪随机数生成器 (pseudorandom number generator,RPNG,又称为确定性随机位生成器)增加了新的接口类型和实现,使得开发者更容易在应用程序中互换使用各种 PRNG 算法。 > [RPNG](https://ctf-wiki.org/crypto/streamcipher/prng/intro/) 用来生成接近于绝对随机数序列的数字序列。一般来说,PRNG 会依赖于一个初始值,也称为种子,来生成对应的伪随机数序列。只要种子确定了,PRNG 所生成的随机数就是完全确定的,因此其生成的随机数序列并不是真正随机的。 使用示例: ```java RandomGeneratorFactory l128X256MixRandom = RandomGeneratorFactory.of("L128X256MixRandom"); // 使用时间戳作为随机数种子 RandomGenerator randomGenerator = l128X256MixRandom.create(System.currentTimeMillis()); // 生成随机数 randomGenerator.nextInt(10)); ``` ## JEP 398:弃用 Applet API 以进行删除 Applet API 用于编写在 Web 浏览器端运行的 Java 小程序,很多年前就已经被淘汰了,已经没有理由使用了。 Applet API 在 Java 9 时被标记弃用([JEP 289](https://openjdk.java.net/jeps/289)),但不是为了删除。 ## JEP 406:switch 的类型匹配(预览) 正如 `inst