---
title: Java 17 æ°ç¹æ§æ¦è§
category: Java
tag:
- Javaæ°ç¹æ§
---
Java 17 å¨ 2021 å¹´ 9 æ 14 æ¥æ£å¼åå¸ï¼æ¯ä¸ä¸ªé¿ææ¯æï¼LTSï¼çæ¬ã
ä¸é¢è¿å¼ 徿¯ Oracle 宿¹ç»åºç Oracle JDK æ¯æçæ¶é´çº¿ãå¯ä»¥çå¾å°ï¼Java
17 æå¤å¯ä»¥æ¯æå° 2029 å¹´ 9 æä»½ã

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 çç±»åå¹é
ï¼é¢è§ï¼
æ£å¦ `instanceof` 䏿 ·ï¼ `switch` ä¹ç´§è·çå¢å äºç±»åå¹é
èªå¨è½¬æ¢åè½ã
`instanceof` 代ç 示ä¾ï¼
```java
// Old code
if (o instanceof String) {
String s = (String)o;
... use s ...
}
// New code
if (o instanceof String s) {
... use s ...
}
```
`switch` 代ç 示ä¾ï¼
```java
// Old code
static String formatter(Object o) {
String formatted = "unknown";
if (o instanceof Integer i) {
formatted = String.format("int %d", i);
} else if (o instanceof Long l) {
formatted = String.format("long %d", l);
} else if (o instanceof Double d) {
formatted = String.format("double %f", d);
} else if (o instanceof String s) {
formatted = String.format("String %s", s);
}
return formatted;
}
// New code
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();
};
}
```
å¯¹äº `null` å¼ç夿ä¹è¿è¡äºä¼åã
```java
// Old code
static void testFooBar(String s) {
if (s == null) {
System.out.println("oops!");
return;
}
switch (s) {
case "Foo", "Bar" -> System.out.println("Great");
default -> System.out.println("Ok");
}
}
// New code
static void testFooBar(String s) {
switch (s) {
case null -> System.out.println("Oops");
case "Foo", "Bar" -> System.out.println("Great");
default -> System.out.println("Ok");
}
}
```
## JEP 407:å é¤è¿ç¨æ¹æ³è°ç¨æ¿æ´»æºå¶
å é¤è¿ç¨æ¹æ³è°ç¨ (RMI) æ¿æ´»æºå¶ï¼åæ¶ä¿ç RMI çå
¶ä½é¨åãRMI æ¿æ´»æºå¶å·²è¿æ¶ä¸ä¸å使ç¨ã
## JEP 409ï¼å¯å°ç±»ï¼è½¬æ£ï¼
å¯å°ç±»ç± [JEP 360](https://openjdk.java.net/jeps/360) æåºé¢è§ï¼éæå°äº Java 15 ä¸ãå¨ JDK 16 ä¸ï¼ å¯å°ç±»å¾å°äºæ¹è¿ï¼æ´å ä¸¥æ ¼çå¼ç¨æ£æ¥åå¯å°ç±»çç»§æ¿å
³ç³»ï¼ï¼ç± [JEP 397](https://openjdk.java.net/jeps/397) æåºäºå次é¢è§ã
å¨ [Java 15 æ°ç¹æ§æ¦è§](./java15.md) ä¸ï¼ææè¯¦ç»ä»ç»å°å¯å°ç±»ï¼è¿éå°±ä¸ååé¢å¤çä»ç»äºã
## JEP 410:å é¤å®éªæ§ç AOT å JIT ç¼è¯å¨
å¨ Java 9 ç [JEP 295](https://openjdk.java.net/jeps/295) ,å¼å
¥äºå®éªæ§çæå (AOT) ç¼è¯å¨ï¼å¨å¯å¨èææºä¹åå° Java ç±»ç¼è¯ä¸ºæ¬æºä»£ç ã
Java 17ï¼å é¤å®éªæ§çæå (AOT) å峿¶ (JIT) ç¼è¯å¨ï¼å 为该ç¼è¯å¨èªæ¨åºä»¥æ¥å¾å°ä½¿ç¨ï¼ç»´æ¤å®æéçå·¥ä½éå¾å¤§ãä¿çå®éªæ§ç Java 级 JVM ç¼è¯å¨æ¥å£ (JVMCI)ï¼ä»¥ä¾¿å¼å人åå¯ä»¥ç»§ç»ä½¿ç¨å¤é¨æå»ºçç¼è¯å¨çæ¬è¿è¡ JIT ç¼è¯ã
## JEP 411:å¼ç¨å®å
¨ç®¡çå¨ä»¥è¿è¡å é¤
å¼ç¨å®å
¨ç®¡çå¨ä»¥ä¾¿å¨å°æ¥ççæ¬ä¸å é¤ã
å®å
¨ç®¡çå¨å¯è¿½æº¯å° Java 1.0ï¼å¤å¹´æ¥ï¼å®ä¸ç´ä¸æ¯ä¿æ¤å®¢æ·ç«¯ Java 代ç çä¸»è¦æ¹æ³ï¼ä¹å¾å°ç¨äºä¿æ¤æå¡å¨ç«¯ä»£ç ãä¸ºäºæ¨å¨ Java åååå±ï¼Java 17 å¼ç¨å®å
¨ç®¡çå¨ï¼ä»¥ä¾¿ä¸æ§ç Applet API ( [JEP 398](https://openjdk.java.net/jeps/398) ) ä¸èµ·ç§»é¤ã
## JEP 412:å¤é¨å½æ°åå
å APIï¼åµåï¼
Java ç¨åºå¯ä»¥éè¿è¯¥ API ä¸ Java è¿è¡æ¶ä¹å¤ç代ç åæ°æ®è¿è¡äºæä½ãéè¿é«æå°è°ç¨å¤é¨å½æ°ï¼å³ JVM ä¹å¤ç代ç ï¼åå®å
¨å°è®¿é®å¤é¨å
åï¼å³ä¸å JVM 管ççå
åï¼ï¼è¯¥ API 使 Java ç¨åºè½å¤è°ç¨æ¬æºåºå¹¶å¤çæ¬æºæ°æ®ï¼èä¸ä¼å JNI 飿 ·å±é©åèå¼±ã
å¤é¨å½æ°åå
å API å¨ Java 17 ä¸è¿è¡äºç¬¬ä¸è½®åµåï¼ç± [JEP 412](https://openjdk.java.net/jeps/412) æåºã第äºè½®åµåç±[ JEP 419](https://openjdk.org/jeps/419) æåºå¹¶éæå°äº Java 18 ä¸ï¼é¢è§ç± [JEP 424](https://openjdk.org/jeps/424) æåºå¹¶éæå°äº Java 19 ä¸ã
å¨ [Java 19 æ°ç¹æ§æ¦è§](./java19.md) ä¸ï¼ææè¯¦ç»ä»ç»å°å¤é¨å½æ°åå
å APIï¼è¿éå°±ä¸ååé¢å¤çä»ç»äºã
## JEP 414:åé APIï¼ç¬¬äºæ¬¡åµåï¼
åéï¼Vectorï¼ API æåç± [JEP 338](https://openjdk.java.net/jeps/338) æåºï¼å¹¶ä½ä¸º[åµå API](http://openjdk.java.net/jeps/11)éæå° Java 16 ä¸ã第äºè½®åµåç± [JEP 414](https://openjdk.java.net/jeps/414) æåºå¹¶éæå° Java 17 ä¸ï¼ç¬¬ä¸è½®åµåç± [JEP 417](https://openjdk.java.net/jeps/417) æåºå¹¶éæå° Java 18 ä¸ï¼ç¬¬åè½®ç± [JEP 426](https://openjdk.java.net/jeps/426) æåºå¹¶éæå°äº Java 19 ä¸ã
该åµåå¨ API æä¾äºä¸ä¸ª API çåå§è¿ä»£ä»¥è¡¨è¾¾ä¸äºåé计ç®ï¼è¿äºè®¡ç®å¨è¿è¡æ¶å¯é å°ç¼è¯ä¸ºæ¯æç CPU æ¶æä¸çæä½³åé硬件æä»¤ï¼ä»èè·å¾ä¼äºåçæ é计ç®çæ§è½ï¼å
åå©ç¨åæä»¤å¤æ°æ®ï¼SIMDï¼ææ¯ï¼å¤§å¤æ°ç°ä»£ CPU ä¸é½å¯ä»¥ä½¿ç¨çä¸ç§æä»¤ï¼ã尽管 HotSpot æ¯æèªå¨åéåï¼ä½æ¯å¯è½¬æ¢çæ éæä½éæé䏿åä»£ç æ´æ¹çå½±åã该 API å°ä½¿å¼å人åè½å¤è½»æ¾å°ç¨ Java ç¼åå¯ç§»æ¤ç髿§è½åéç®æ³ã
å¨ [Java 18 æ°ç¹æ§æ¦è§](./java18.md) ä¸ï¼ææè¯¦ç»ä»ç»å°åé APIï¼è¿éå°±ä¸ååé¢å¤çä»ç»äºã