---
title: Java 22 & 23 æ°ç¹æ§æ¦è§
description: æ¦è§ JDK 22/23 çå
³é® JEP ä¸è¯è¨/å¹³å°å¢å¼ºï¼æç»è¿½è¸ªæ§è½ä¸å¹¶åç¸å
³æ¹å¨ã
category: Java
tag:
- Javaæ°ç¹æ§
head:
- - meta
- name: keywords
content: Java 22,Java 23,JEP,Markdown ææ¡£æ³¨é,ç±»æä»¶ API,åé API,ç»æåå¹¶å,ä½ç¨åå¼
---
JDK 23 å JDK 22 䏿 ·ï¼è¿ä¹æ¯ä¸ä¸ªé LTSï¼é¿ææ¯æï¼çæ¬ï¼Oracle ä»
æä¾å
个æçæ¯æãä¸ä¸ä¸ªé¿ææ¯æçæ¯ JDK 25ï¼é¢è®¡äº 2025 å¹´ 9 æåå¸ã
ä¸å¾æ¯ä» JDK8 å° JDK 24 æ¯ä¸ªçæ¬çæ´æ°å¸¦æ¥çæ°ç¹æ§æ°éåæ´æ°æ¶é´ï¼

ç±äº JDK 22 å JDK 23 éåçæ°ç¹æ§è¾å¤ï¼è¿é主è¦ä»¥ JDK 23 为主ä»ç»ï¼ä¼è¡¥å
JDK 22 ç¬æçä¸äºç¹æ§ã
JDK 23 ä¸å
±æ 12 个æ°ç¹æ§ï¼
- [JEP 455: Primitive Types in Patterns, instanceof, and switch (Preview)ï¼æ¨¡å¼ä¸çåå§ç±»åãinstanceof å switchï¼é¢è§ï¼](https://openjdk.org/jeps/455)
- [JEP 466: Class File API (Second Preview)ï¼ç±»æä»¶ APIï¼ç¬¬äºæ¬¡é¢è§ï¼](https://openjdk.org/jeps/466)
- [JEP 467: Markdown Documentation Commentsï¼Markdown ææ¡£æ³¨éï¼](https://openjdk.org/jeps/467)
- [JEP 469: Vector API (Eighth Incubator)ï¼åé APIï¼ç¬¬å
«æ¬¡åµåï¼](https://openjdk.org/jeps/469)
- [JEP 473: Stream Gatherers (Second Preview)ï¼æµæ¶éå¨ï¼ç¬¬äºæ¬¡é¢è§ï¼](https://openjdk.org/jeps/473)
- [JEP 471: Deprecate the Memory-Access Methods in sun.misc.Unsafe for Removalï¼å¼ç¨ sun.misc.Unsafe ä¸çå
åè®¿é®æ¹æ³ä»¥ä¾¿ç§»é¤ï¼](https://openjdk.org/jeps/471)
- [JEP 474: ZGC: Generational Mode by Defaultï¼ZGCï¼é»è®¤çå代模å¼ï¼](https://openjdk.org/jeps/474)
- [JEP 476: Module Import Declarations (Preview)ï¼æ¨¡å导å
¥å£°æï¼é¢è§ï¼](https://openjdk.org/jeps/476)
- [JEP 477: Unnamed Classes and Instance Main Methods (Third Preview)ï¼æªå½åç±»åå®ä¾ main æ¹æ³ï¼ç¬¬ä¸æ¬¡é¢è§ï¼](https://openjdk.org/jeps/477)
- [JEP 480: Structured Concurrency (Third Preview)ï¼ç»æåå¹¶åï¼ç¬¬ä¸æ¬¡é¢è§ï¼](https://openjdk.org/jeps/480)
- [JEP 481: Scoped Values (Third Preview)ï¼ä½ç¨åå¼ï¼ç¬¬ä¸æ¬¡é¢è§ï¼](https://openjdk.org/jeps/481)
- [JEP 482: Flexible Constructor Bodies (Second Preview)ï¼çµæ´»çæé 彿°ä½ï¼ç¬¬äºæ¬¡é¢è§ï¼](https://openjdk.org/jeps/482)
JDK 22 å
±æ 12 个æ°ç¹æ§ï¼å¦ä¸æç¤ºï¼

å
¶ä¸ï¼ä¸é¢è¿ 4 æ¡æ°ç¹æ§æä¼åç¬æåºæ¥è¯¦ç»ä»ç»ä¸ä¸ï¼
- [JEP 423ï¼G1 å徿¶éå¨åºååºå®](https://openjdk.org/jeps/423)
- [JEP 454ï¼å¤é¨å½æ°ä¸å
å API](https://openjdk.org/jeps/454)
- [JEP 456ï¼æªå½å模å¼ååé](https://openjdk.org/jeps/456)
- [JEP 458ï¼å¯å¨å¤æä»¶æºä»£ç ç¨åº](https://openjdk.org/jeps/458)
## JDK 23
### JEP 455: 模å¼ä¸çåå§ç±»åãinstanceof å switchï¼é¢è§ï¼
å¨ JEP 455 ä¹åï¼ `instanceof` åªæ¯æå¼ç¨ç±»åï¼`switch` 表达å¼åè¯å¥ç `case` æ ç¾åªè½ä½¿ç¨æ´æ°åé¢éãæä¸¾å¸¸éåå符串åé¢éã
JEP 455 çé¢è§ç¹æ§ä¸ï¼`instanceof` å `switch` å
¨é¢æ¯æææåå§ç±»åï¼å
æ¬ `byte`, `short`, `char`, `int`, `long`, `float`, `double`, `boolean`ã
```java
// ä¼ ç»åæ³
if (i >= -128 && i <= 127) {
byte b = (byte)i;
... b ...
}
// ä½¿ç¨ instanceof æ¹è¿
if (i instanceof byte b) {
... b ...
}
long v = ...;
// ä¼ ç»åæ³
if (v == 1L) {
// ...
} else if (v == 2L) {
// ...
} else if (v == 10_000_000_000L) {
// ...
}
// ä½¿ç¨ long ç±»åç case æ ç¾
switch (v) {
case 1L:
// ...
break;
case 2L:
// ...
break;
case 10_000_000_000L:
// ...
break;
default:
// ...
}
```
### JEP 466: Class File APIï¼ç¬¬äºæ¬¡é¢è§ï¼
ç±»æä»¶ API å¨ JDK 22 è¿è¡äºç¬¬ä¸æ¬¡é¢è§ï¼ç± [JEP 457](https://openjdk.org/jeps/457) æåºã
ç±»æä»¶ API çç®æ æ¯æä¾ä¸å¥æ ååç APIï¼ç¨äºè§£æãçæåè½¬æ¢ Java ç±»æä»¶ï¼å代è¿å»å¯¹ç¬¬ä¸æ¹åºï¼å¦ ASMï¼å¨ç±»æä»¶å¤çä¸çä¾èµã
```java
// å建ä¸ä¸ª ClassFile 对象ï¼è¿æ¯æä½ç±»æä»¶çå
¥å£ã
ClassFile cf = ClassFile.of();
// è§£æåèæ°ç»ä¸º ClassModel
ClassModel classModel = cf.parse(bytes);
// æå»ºæ°çç±»æä»¶ï¼ç§»é¤ä»¥ "debug" å¼å¤´çæææ¹æ³
byte[] newBytes = cf.build(classModel.thisClass().asSymbol(),
classBuilder -> {
// éåææç±»å
ç´
for (ClassElement ce : classModel) {
// 夿æ¯å¦ä¸ºæ¹æ³ ä¸ æ¹æ³å以 "debug" å¼å¤´
if (!(ce instanceof MethodModel mm
&& mm.methodName().stringValue().startsWith("debug"))) {
// æ·»å å°æ°çç±»æä»¶ä¸
classBuilder.with(ce);
}
}
});
```
### JEP 467ï¼Markdown ææ¡£æ³¨é
å¨ JavaDoc ææ¡£æ³¨éä¸å¯ä»¥ä½¿ç¨ Markdown è¯æ³ï¼å代忬åªè½ä½¿ç¨ HTML å JavaDoc æ ç¾çæ¹å¼ã
Markdown æ´ç®æ´æè¯»ï¼åå°äºæå¨ç¼å HTML çç¹çï¼åæ¶ä¿çäºå¯¹ HTML å
ç´ å JavaDoc æ ç¾çæ¯æãè¿ä¸ªå¢å¼ºæ¨å¨è®© API ææ¡£æ³¨éçç¼ååé
读å徿´å è½»æ¾ï¼åæ¶ä¸ä¼å½±åç°ææ³¨éçè§£éãMarkdown æä¾äºå¯¹å¸¸è§ææ¡£å
ç´ ï¼å¦æ®µè½ãå表ã龿¥çï¼çç®å表达æ¹å¼ï¼æåäºææ¡£æ³¨éçå¯ç»´æ¤æ§åå¼åè
ä½éªã

### JEP 469ï¼åé APIï¼ç¬¬å
«æ¬¡åµåï¼
åé计ç®ç±å¯¹åéçä¸ç³»åæä½ç»æãåé API ç¨æ¥è¡¨è¾¾åé计ç®ï¼è¯¥è®¡ç®å¯ä»¥å¨è¿è¡æ¶å¯é å°ç¼è¯ä¸ºæ¯æç CPU æ¶æä¸çæä½³åéæä»¤ï¼ä»èå®ç°ä¼äºçææ é计ç®çæ§è½ã
åé API çç®æ æ¯ä¸ºç¨æ·æä¾ç®æ´æç¨ä¸ä¸å¹³å°æ å
³ç表达èå´å¹¿æ³çåé计ç®ã
è¿æ¯å¯¹æ°ç»å
ç´ çç®åæ é计ç®ï¼
```java
void scalarComputation(float[] a, float[] b, float[] c) {
for (int i = 0; i < a.length; i++) {
c[i] = (a[i] * a[i] + b[i] * b[i]) * -1.0f;
}
}
```
è¿æ¯ä½¿ç¨ Vector API è¿è¡ççæåé计ç®ï¼
```java
static final VectorSpecies SPECIES = FloatVector.SPECIES_PREFERRED;
void vectorComputation(float[] a, float[] b, float[] c) {
int i = 0;
int upperBound = SPECIES.loopBound(a.length);
for (; i < upperBound; i += SPECIES.length()) {
// FloatVector va, vb, vc;
var va = FloatVector.fromArray(SPECIES, a, i);
var vb = FloatVector.fromArray(SPECIES, b, i);
var vc = va.mul(va)
.add(vb.mul(vb))
.neg();
vc.intoArray(c, i);
}
for (; i < a.length; i++) {
c[i] = (a[i] * a[i] + b[i] * b[i]) * -1.0f;
}
}
```
### JEP 473ï¼æµæ¶éå¨ï¼ç¬¬äºæ¬¡é¢è§ï¼
æµæ¶éå¨å¨ JDK 22 è¿è¡äºç¬¬ä¸æ¬¡é¢è§ï¼ç± [JEP 461](https://openjdk.org/jeps/461) æåºã
è¿ä¸ªæ¹è¿ä½¿å¾ Stream API å¯ä»¥æ¯æèªå®ä¹ä¸é´æä½ã
```java
source.gather(a).gather(b).gather(c).collect(...)
```
### JEP 471ï¼å¼ç¨ sun.misc.Unsafe ä¸çå
åè®¿é®æ¹æ³
JEP 471 æè®®å¼ç¨ `sun.misc.Unsafe` ä¸çå
åè®¿é®æ¹æ³ï¼è¿äºæ¹æ³å°æ¥ççæ¬ä¸ä¼è¢«ç§»é¤ã
è¿äºä¸å®å
¨çæ¹æ³å·²æå®å
¨é«æçæ¿ä»£æ¹æ¡ï¼
- `java.lang.invoke.VarHandle` ï¼JDK 9 (JEP 193) ä¸å¼å
¥ï¼æä¾äºä¸ç§å®å
¨ææå°æä½å å
åçæ¹æ³ï¼å
æ¬å¯¹è±¡çåæ®µãç±»çéæåæ®µä»¥åæ°ç»å
ç´ ã
- `java.lang.foreign.MemorySegment` ï¼JDK 22 (JEP 454) ä¸å¼å
¥ï¼æä¾äºä¸ç§å®å
¨ææå°è®¿é®å å¤å
åçæ¹æ³ï¼ææ¶ä¼ä¸ `VarHandle` ååå·¥ä½ã
è¿ä¸¤ä¸ªç±»æ¯ Foreign Function & Memory APIï¼å¤é¨å½æ°åå
å APIï¼ çæ ¸å¿ç»ä»¶ï¼åå«ç¨äºç®¡çåæä½å å¤å
åãForeign Function & Memory API å¨ JDK 22 䏿£å¼è½¬æ£ï¼æä¸ºæ åç¹æ§ã
```java
import jdk.incubator.foreign.*;
import java.lang.invoke.VarHandle;
// 管çå 夿´æ°æ°ç»çç±»
class OffHeapIntBuffer {
// ç¨äºè®¿é®æ´æ°å
ç´ çVarHandle
private static final VarHandle ELEM_VH = ValueLayout.JAVA_INT.arrayElementVarHandle();
// å
å管çå¨
private final Arena arena;
// å å¤å
åæ®µ
private final MemorySegment buffer;
// æé 彿°ï¼åé
æå®æ°éçæ´æ°ç©ºé´
public OffHeapIntBuffer(long size) {
this.arena = Arena.ofShared();
this.buffer = arena.allocate(ValueLayout.JAVA_INT, size);
}
// éæ¾å
å
public void deallocate() {
arena.close();
}
// 以volatileæ¹å¼è®¾ç½®æå®ç´¢å¼çå¼
public void setVolatile(long index, int value) {
ELEM_VH.setVolatile(buffer, 0L, index, value);
}
// åå§åæå®èå´çå
ç´ ä¸º0
public void initialize(long start, long n) {
buffer.asSlice(ValueLayout.JAVA_INT.byteSize() * start,
ValueLayout.JAVA_INT.byteSize() * n)
.fill((byte) 0);
}
// å°æå®èå´çå
ç´ å¤å¶å°æ°æ°ç»
public int[] copyToNewArray(long start, int n) {
return buffer.asSlice(ValueLayout.JAVA_INT.byteSize() * start,
ValueLayout.JAVA_INT.byteSize() * n)
.toArray(ValueLayout.JAVA_INT);
}
}
```
### JEP 474ï¼ZGCï¼é»è®¤çå代模å¼
Z åå¾åæ¶å¨ (ZGC) çé»è®¤æ¨¡å¼åæ¢ä¸ºå代模å¼ï¼å¹¶å¼ç¨éå代模å¼ï¼è®¡å卿ªæ¥çæ¬ä¸ç§»é¤ãè¿æ¯å 为å代 ZGC æ¯å¤§å¤æ°åºæ¯ä¸çæ´ä¼éæ©ã
### JEP 476ï¼æ¨¡å导å
¥å£°æ (é¢è§)
模å导å
¥å£°æå
è®¸å¨ Java 代ç ä¸ç®æ´å°å¯¼å
¥æ´ä¸ªæ¨¡åçææå¯¼åºå
ï¼èæ éé个声æå
ç导å
¥ãè¿ä¸ç¹æ§ç®åäºæ¨¡åååºçéç¨ï¼ç¹å«æ¯å¨ä½¿ç¨å¤ä¸ªæ¨¡åæ¶ï¼é¿å
äºå¤§éçå
导å
¥å£°æï¼ä½¿å¾å¼åè
å¯ä»¥æ´æ¹ä¾¿å°è®¿é®ç¬¬ä¸æ¹åºå Java åºæ¬ç±»ã
æ¤ç¹æ§å¯¹åå¦è
åååå¼å尤为æç¨ï¼å ä¸ºå®æ éå¼åè
å°èªå·±çä»£ç æ¨¡ååï¼åæ¶ä¿çäºå¯¹ä¼ ç»å¯¼å
¥æ¹å¼çå
¼å®¹æ§ï¼æåäºå¼åæçå代ç å¯è¯»æ§ã
```java
// 导å
¥æ´ä¸ª java.base 模åï¼å¼åè
å¯ä»¥ç´æ¥è®¿é® ListãMapãStream çç±»ï¼èæ éæ¯æ¬¡æå¨å¯¼å
¥ç¸å
³å
import module java.base;
public class Example {
public static void main(String[] args) {
String[] fruits = { "apple", "berry", "citrus" };
Map fruitMap = Stream.of(fruits)
.collect(Collectors.toMap(
s -> s.toUpperCase().substring(0, 1),
Function.identity()));
System.out.println(fruitMap);
}
}
```
### JEP 477ï¼æªå½åç±»åå®ä¾ main æ¹æ³ ï¼ç¬¬ä¸æ¬¡é¢è§ï¼
è¿ä¸ªç¹æ§ä¸»è¦ç®åäº `main` æ¹æ³ç声æãå¯¹äº Java åå¦è
æ¥è¯´ï¼è¿ä¸ª `main` æ¹æ³ç声æå¼å
¥äºå¤ªå¤ç Java è¯æ³æ¦å¿µï¼ä¸å©äºåå¦è
å¿«é䏿ã
没æä½¿ç¨è¯¥ç¹æ§ä¹åå®ä¹ä¸ä¸ª `main` æ¹æ³ï¼
```java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
```
使ç¨è¯¥æ°ç¹æ§ä¹åå®ä¹ä¸ä¸ª `main` æ¹æ³ï¼
```java
class HelloWorld {
void main() {
System.out.println("Hello, World!");
}
}
```
è¿ä¸æ¥ç®åï¼æªå½åçç±»å
许æä»¬çç¥ç±»åï¼
```java
void main() {
System.out.println("Hello, World!");
}
```
### JEP 480ï¼ç»æåå¹¶å ï¼ç¬¬ä¸æ¬¡é¢è§ï¼
Java 19 å¼å
¥äºç»æåå¹¶åï¼ä¸ç§å¤çº¿ç¨ç¼ç¨æ¹æ³ï¼ç®çæ¯ä¸ºäºéè¿ç»æåå¹¶å API æ¥ç®åå¤çº¿ç¨ç¼ç¨ï¼å¹¶ä¸æ¯ä¸ºäºå代`java.util.concurrent`ï¼ç®åå¤äºåµåå¨é¶æ®µã
ç»æåå¹¶åå°ä¸å线ç¨ä¸è¿è¡çå¤ä¸ªä»»å¡è§ä¸ºå个工ä½åå
ï¼ä»èç®åé误å¤çãæé«å¯é æ§å¹¶å¢å¼ºå¯è§å¯æ§ãä¹å°±æ¯è¯´ï¼ç»æåå¹¶åä¿çäºå线ç¨ä»£ç çå¯è¯»æ§ãå¯ç»´æ¤æ§åå¯è§å¯æ§ã
ç»æåå¹¶åçåºæ¬ API æ¯[`StructuredTaskScope`](https://download.java.net/java/early_access/loom/docs/api/jdk.incubator.concurrent/jdk/incubator/concurrent/StructuredTaskScope.html)ã`StructuredTaskScope` æ¯æå°ä»»å¡æå为å¤ä¸ªå¹¶ååä»»å¡ï¼å¨å®ä»¬èªå·±ç线ç¨ä¸æ§è¡ï¼å¹¶ä¸åä»»å¡å¿
é¡»å¨ä¸»ä»»å¡ç»§ç»ä¹å宿ã
`StructuredTaskScope` çåºæ¬ç¨æ³å¦ä¸ï¼
```java
try (var scope = new StructuredTaskScope