--- title: Java 17 新特性概览(重要) description: 总结 JDK 17 的重要更新与 JEP,涵盖密封类、记录类与模式匹配等特性。 category: Java tag: - Java新特性 head: - - meta - name: keywords content: Java 17,JDK17,LTS,密封类,记录类,模式匹配,API 更新,JEP --- Java 17 在 2021 年 9 月 14 日正式发布,是一个长期支持(LTS)版本。 下面这张图是 Oracle 官方给出的 Oracle JDK 支持的时间线。可以看得到,Java 17 最多可以支持到 2029 年 9 月份。 ![](https://oss.javaguide.cn/github/javaguide/java/new-features/4c1611fad59449edbbd6e233690e9fa7.png) Java 17 将是继 Java 8 以来最重要的长期支持(LTS)版本,是 Java 社区八年努力的成果。Spring 6.x 和 Spring Boot 3.x 最低支持的就是 Java 17。 JDK 17 共有 14 个新特性,这篇文章会挑选其中较为重要的一些新特性进行详细介绍: - [JEP 356: Enhanced Pseudo-Random Number Generators(增强的伪随机数生成器)](https://openjdk.java.net/jeps/356) - [JEP 398: Deprecate the Applet API for Removal(标记弃用 Applet API 以便移除)](https://openjdk.java.net/jeps/398) - [JEP 406: Pattern Matching for switch (Preview)(switch 模式匹配,预览)](https://openjdk.java.net/jeps/406) - [JEP 407: Remove RMI Activation(移除 RMI 激活机制)](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 (Incubator)(外部函数和内存 API,第一次孵化)](https://openjdk.java.net/jeps/412) - [JEP 414: Vector API (Second Incubator)(向量 API,第二次孵化)](https://openjdk.java.net/jeps/414) 下图是从 JDK 8 到 JDK 16 每个版本的更新带来的新特性数量和更新时间: ![](https://oss.javaguide.cn/github/javaguide/java/new-features/jdk8~jdk24.png) 相关阅读:[OpenJDK Java 17 文档](https://openjdk.java.net/projects/jdk/17/) 。 ## JEP 356: Enhanced Pseudo-Random Number Generators(增强的伪随机数生成器) JDK 17 之前,我们可以借助 `Random`、`ThreadLocalRandom`和`SplittableRandom`来生成随机数。不过,这 3 个类都各有缺陷,且缺少常见的伪随机算法支持。 Java 17 为伪随机数生成器 (pseudorandom number generator,PRNG,又称为确定性随机位生成器)增加了新的接口类型和实现,使得开发者更容易在应用程序中互换使用各种 PRNG 算法。 > [PRNG](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: Deprecate the Applet API for Removal(标记弃用 Applet API 以便移除) Applet API 用于编写在 Web 浏览器端运行的 Java 小程序,很多年前就已经被淘汰了,已经没有理由使用了。 Applet API 在 Java 9 时被标记弃用([JEP 289](https://openjdk.java.net/jeps/289)),但不是为了删除。 ## JEP 406: Pattern Matching for