---
title: Java 12 & 13 æ°ç¹æ§æ¦è§
description: å½çº³ JDK 12/13 çç¹æ§æ´æ°ï¼å
å«å符串å¢å¼ºãswitch æ¹è¿ä¸ GC è°æ´çã
category: Java
tag:
- Javaæ°ç¹æ§
head:
- - meta
- name: keywords
content: Java 12,Java 13,å符串å¢å¼º,åæ¢è¡¨è¾¾å¼,åå¾åæ¶,JEP
---
## Java 12
JDK 12 äº 2019 å¹´ 3 æ 19 æ¥åå¸ï¼è¿æ¯ä¸ä¸ªé LTS çæ¬ã
è¿ç¯æç« 伿éå
¶ä¸è¾ä¸ºéè¦çä¸äºæ°ç¹æ§è¿è¡è¯¦ç»ä»ç»ï¼
- [JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)](https://openjdk.org/jeps/189)
- [JEP 325: Switch Expressions (Preview) (switch 表达å¼, é¢è§ç¹æ§)](https://openjdk.org/jeps/325)
- [JEP 334: JVM Constants API (JVM 常é API)](https://openjdk.org/jeps/334)
- [JEP 344: Abortable Mixed Collections for G1 (G1 å¯ä¸æ¢çæ··åæ¶ééå)](https://openjdk.org/jeps/344)
- [JEP 346: Promptly Return Unused Committed Memory (G1 åæ¶è¿åæªä½¿ç¨çå·²åé
å
å)](https://openjdk.org/jeps/346)
ä¸å¾æ¯ä» JDK 8 å° JDK 25 æ¯ä¸ªçæ¬çæ´æ°å¸¦æ¥çæ°ç¹æ§æ°éåæ´æ°æ¶é´ï¼

### JEP 189: Shenandoahï¼ä½å»¶è¿å徿¶éå¨ï¼å®éªæ§ï¼
Redhat 主导å¼åç Pauseless GC å®ç°ï¼ä¸»è¦ç®æ æ¯ 99.9% çæåå°äº 10msï¼æåä¸å 大尿 å
³ç
å Java11 弿ºç ZGC ç¸æ¯ï¼éè¦åçº§å° JDK11 æè½ä½¿ç¨ï¼ï¼Shenandoah GC æç¨³å®ç JDK8u çæ¬ï¼å¨ Java8 å æ®ä¸»è¦å¸åºä»½é¢çä»å¤©ææ´å¤§çå¯è½å°æ§ã
### JEP 344 & JEP 346: G1 æ¶éå¨ä¼å
Java12 为é»è®¤çå徿¶éå¨ G1 带æ¥äºä¸¤é¡¹æ´æ°:
- **å¯ä¸æ¢çæ··åæ¶ééå**ï¼JEP344 çå®ç°ï¼ä¸ºäºè¾¾å°ç¨æ·æä¾çåé¡¿æ¶é´ç®æ ï¼JEP 344 éè¿æè¦è¢«åæ¶çåºåéï¼æ··åæ¶ééåï¼æå为强å¶åå¯éé¨åï¼ä½¿ G1 åå¾åæ¶å¨è½ä¸æ¢åå¾åæ¶è¿ç¨ã G1 å¯ä»¥ä¸æ¢å¯éé¨åçåæ¶ä»¥è¾¾å°åé¡¿æ¶é´ç®æ
- **åæ¶è¿åæªä½¿ç¨çå·²åé
å
å**ï¼JEP346 çå®ç°ï¼å¢å¼º G1 GCï¼ä»¥ä¾¿å¨ç©ºé²æ¶èªå¨å° Java å å
åè¿åç»æä½ç³»ç»
### JEP 334: JVM Constants APIï¼JVM 常é APIï¼
å¼å
¥äºä¸ä¸ª API æ¥å¯¹å
³é®ç±»æä»¶åè¿è¡æ¶å·¥ä»¶çåä¹æè¿°è¿è¡å»ºæ¨¡ï¼ç¹å«æ¯å¯ä»¥ä»å¸¸éæ± å è½½ç常éã
è¿ä¸ª API æä¾äºä¸ç»æ¥å£åå·¥å
·ç±»ï¼ç¨äºè¡¨ç¤ºåæä½ç±»æä»¶ä¸ç叏鿱 æ¡ç®ãå®ä¸»è¦å
æ¬ï¼
- **常éæè¿°ç¬¦æ¥å£**ï¼`ConstantDesc` æ¥å£åå
¶åæ¥å£ï¼ç¨äºæè¿°åç§ç±»åç常é
- **常éå¼ç±»å**ï¼`ClassDesc`ã`MethodTypeDesc`ã`MethodHandleDesc`ã`DynamicConstantDesc` ç
- **å¼å¯¼æ¹æ³**ï¼æ¯æ `invokedynamic` æä»¤å常é卿å¼å¯¼æ¹æ³
è¿ä¸ª API ä¸»è¦æ¯ä¸ºäºæ¯æä»¥ä¸åºæ¯ï¼
1. **ç±»æä»¶æä½**ï¼æä¾äºä¸ç§æ ååçæ¹å¼æ¥æè¿°åæä½ç±»æä»¶ä¸ç叏鿱
2. **åèç çæ**ï¼ç®åäºåèç çææ¡æ¶ï¼å¦ ASMï¼ä¸ Java 代ç ç交äº
3. **åå°å¢å¼º**ï¼ä½¿å¾å尿使´å ç±»åå®å
¨åè¡¨è¾¾åæ´å¼º
4. **ç¼è¯å¨å·¥å
·**ï¼ä¸ºç¼è¯å¨å代ç çæå·¥å
·æä¾äºæ´å¥½çæ½è±¡
è¿ä¸ª API æ¯ Java 12 ä¸éè¦çåºå±æ¹è¿ï¼ä¸ºåç»çåèç æä½åç¼è¯å¨ç¹æ§å¥ å®äºåºç¡ã
### JEP 325: Switch Expressionsï¼switch 表达å¼ï¼é¢è§ï¼
ä¼ ç»ç `switch` è¯æ³åå¨å®¹ææ¼å `break` çé®é¢ï¼èä¸ä»ä»£ç æ´æ´æ§å±é¢æ¥çï¼å¤ä¸ª break æ¬è´¨ä¹æ¯ä¸ç§éå¤ã
Java12 å¢å¼ºäº `switch` 表达å¼ï¼ä½¿ç¨ç±»ä¼¼ lambda è¯æ³æ¡ä»¶å¹é
æååçæ§è¡åï¼ä¸éè¦å¤å break ã
```java
switch (day) {
case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
case TUESDAY -> System.out.println(7);
case THURSDAY, SATURDAY -> System.out.println(8);
case WEDNESDAY -> System.out.println(9);
}
```
## Java 13
JDK 13 äº 2019 å¹´ 9 æ 17 æ¥åå¸ï¼è¿æ¯ä¸ä¸ªé LTS çæ¬ã
è¿ç¯æç« 伿éå
¶ä¸è¾ä¸ºéè¦çä¸äºæ°ç¹æ§è¿è¡è¯¦ç»ä»ç»ï¼
- [JEP 350: Dynamic CDS Archives (卿 CDS åæ¡£)](https://openjdk.org/jeps/350)
- [JEP 351: ZGC: Uncommit Unused Memory (ZGC éæ¾æªä½¿ç¨å
å)](https://openjdk.org/jeps/351)
- [JEP 355: Text Blocks (Preview) (ææ¬å, é¢è§ç¹æ§)](https://openjdk.org/jeps/355)
- [JEP 354: Switch Expressions (Second Preview) (switch 表达å¼, ç¬¬äºæ¬¡é¢è§)](https://openjdk.org/jeps/354)
ä¸å¾æ¯ä» JDK 8 å° JDK 24 æ¯ä¸ªçæ¬çæ´æ°å¸¦æ¥çæ°ç¹æ§æ°éåæ´æ°æ¶é´ï¼

### JEP 351: ZGCï¼éæ¾æªä½¿ç¨å
åï¼
å¨ Java 11 ä¸å®éªæ§å¼å
¥ç ZGC å¨å®é
ç使ç¨ä¸å卿ªè½ä¸»å¨å°æªä½¿ç¨çå
åéæ¾ç»æä½ç³»ç»çé®é¢ã
ZGC å ç±ä¸ç»ç§°ä¸º ZPages çå åºåç»æãå¨ GC 卿䏿¸
空 ZPages åºåæ¶ï¼å®ä»¬å°è¢«éæ¾å¹¶è¿åå°é¡µé¢ç¼å **ZPageCache** ä¸ï¼æ¤ç¼åä¸ç ZPages ææè¿æå°ä½¿ç¨ï¼LRUï¼ç顺åºï¼å¹¶æç
§å¤§å°è¿è¡ç»ç»ã
å¨ Java 13 ä¸ï¼ZGC å°åæä½ç³»ç»è¿å被æ è¯ä¸ºé¿æ¶é´æªä½¿ç¨ç页é¢ï¼è¿æ ·å®ä»¬å°å¯ä»¥è¢«å
¶ä»è¿ç¨éç¨ã
### JEP 350: Dynamic CDS Archivesï¼å¨æ CDS åæ¡£ï¼
Java 13 ä¸å¯¹ Java 10 ä¸å¼å
¥çåºç¨ç¨åºç±»æ°æ®å
±äº«(AppCDS)è¿è¡äºè¿ä¸æ¥çç®åãæ¹è¿åæ©å±ï¼å³ï¼**å
è®¸å¨ Java åºç¨ç¨åºæ§è¡ç»ææ¶å¨æè¿è¡ç±»å½æ¡£**ï¼å
·ä½è½å¤è¢«å½æ¡£çç±»å
æ¬ææå·²è¢«å è½½ï¼ä½ä¸å±äºé»è®¤åºå± CDS çåºç¨ç¨åºç±»åå¼ç¨ç±»åºä¸çç±»ã
è¿æé«äºåºç¨ç¨åºç±»æ°æ®å
±äº«ï¼[AppCDS](https://openjdk.java.net/jeps/310)ï¼çå¯ç¨æ§ãæ éç¨æ·è¿è¡è¯è¿è¡æ¥ä¸ºæ¯ä¸ªåºç¨ç¨åºå建类å表ã
```bash
java -XX:ArchiveClassesAtExit=my_app_cds.jsa -cp my_app.jar
java -XX:SharedArchiveFile=my_app_cds.jsa -cp my_app.jar
```
### JEP 355: Text Blocksï¼ææ¬åï¼é¢è§ï¼
è§£å³ Java å®ä¹å¤è¡å符串æ¶åªè½éè¿æ¢è¡è½¬ä¹æè
æ¢è¡è¿æ¥ç¬¦æ¥å鿝æçé®é¢ï¼å¼å
¥**ä¸éåå¼å·**æ¥å®ä¹å¤è¡ææ¬ã
Java 13 æ¯æä¸¤ä¸ª `"""` 符å·ä¸é´çä»»ä½å
容é½ä¼è¢«è§£é为å符串çä¸é¨åï¼å
æ¬æ¢è¡ç¬¦ã注æï¼è¿éç"两个"åºç解为"ä¸å¯¹"ï¼å³å¼å§åç»æåä¸ä¸ªã
æªæ¯æææ¬åä¹åç HTML åæ³ï¼
```java
String json ="{\n" +
" \"name\":\"mkyong\",\n" +
" \"age\":38\n" +
"}\n";
```
æ¯æææ¬åä¹åç HTML åæ³ï¼
```java
String json = """
{
"name":"mkyong",
"age":38
}
""";
```
æªæ¯æææ¬åä¹åç SQL åæ³ï¼
```sql
String query = "SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`\n" +
"WHERE `CITY` = 'INDIANAPOLIS'\n" +
"ORDER BY `EMP_ID`, `LAST_NAME`;\n";
```
æ¯æææ¬åä¹åç SQL åæ³ï¼
```sql
String query = """
SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`
WHERE `CITY` = 'INDIANAPOLIS'
ORDER BY `EMP_ID`, `LAST_NAME`;
""";
```
ææ¬åç¸å
³çæ¹æ³ï¼`formatted()`ã`stripIndent()`ã`translateEscapes()`ï¼ä»ç»è¯·åè§æ¬æ [API å¢å¼º - String å¢å¼ºï¼ææ¬åç¸å
³æ¹æ³ï¼](#string-å¢å¼ºææ¬åç¸å
³æ¹æ³) é¨åã
### JEP 354: Switch Expressionsï¼switch 表达å¼ï¼ç¬¬äºæ¬¡é¢è§ï¼
`Switch` 表达å¼ä¸å°±å¤äºä¸ä¸ªå
³é®åç¨äºè·³åº `Switch` åçå
³é®å `yield`ï¼ä¸»è¦ç¨äºè¿åä¸ä¸ªå¼
`yield`å `return` çåºå«å¨äºï¼`return` ä¼ç´æ¥è·³åºå½åå¾ªç¯æè
æ¹æ³ï¼è `yield` åªä¼è·³åºå½å `Switch` åï¼åæ¶å¨ä½¿ç¨ `yield` æ¶ï¼éè¦æ `default` æ¡ä»¶
```java
private static String descLanguage(String name) {
return switch (name) {
case "Java": yield "object-oriented, platform independent and secured";
case "Ruby": yield "a programmer's best friend";
default: yield name +" is a good language";
};
}
```
## API å¢å¼º
并䏿¯ææç API æ¹å¨é½ä¼éè¿ JEPï¼Java Enhancement Proposalï¼æ¥åå¸ã
å¨ JDK çå¼åæµç¨ä¸ï¼**JEP** é常ç¨äºéå¤§çæ¹åï¼ä¾å¦å¼å
¥æ°çè¯è¨ç¹æ§ï¼å¦ `switch` 表达å¼ï¼ãæ°ç JVM æºå¶ï¼å¦ ZGCï¼æè
å¤§è§æ¨¡çåºéæãå `String.indent()` è¿ç§å¨ç°æç±»ä¸å¢å å ä¸ªæ¹æ³çæä½ï¼é常被è§ä¸ºå¸¸è§çåºç»´æ¤ãå®ä»¬ç± JDK å¼åè
ç´æ¥éè¿ **JBS (JDK Bug System)** çå·¥åï¼Ticketï¼è¿è¡æäº¤åè¯å®¡ï¼ç¶åéçæ¬ç´æ¥åå¸ã
### String å¢å¼º
Java 12 å¢å äºä¸¤ä¸ªçå符串å¤çæ¹æ³ã
#### indent() - ç¼©è¿æ¹æ³
`indent()` æ¹æ³å¯ä»¥å®ç°å符串缩è¿ã
```java
String text = "Java";
// ç¼©è¿ 4 æ ¼
text = text.indent(4);
System.out.println(text);
text = text.indent(-10);
System.out.println(text);
```
è¾åºï¼
```plain
Java
Java
```
#### transform() - è½¬æ¢æ¹æ³
`transform()` æ¹æ³å¯ä»¥ç¨æ¥è½¬åæå®å符串ã
```java
String result = "foo".transform(input -> input + " bar");
System.out.println(result); // foo bar
```
### Files å¢å¼º
Java 12 æ·»å äº `mismatch()` æ¹æ³æ¥æ¯è¾ä¸¤ä¸ªæä»¶ï¼
```java
public static long mismatch(Path path, Path path2) throws IOException
```
`mismatch()` æ¹æ³ç¨äºæ¯è¾ä¸¤ä¸ªæä»¶ï¼å¹¶è¿å第ä¸ä¸ªä¸å¹é
å符çä½ç½®ï¼å¦ææä»¶ç¸ååè¿å -1Lã
代ç 示ä¾ï¼ä¸¤ä¸ªæä»¶å
容ç¸åçæ
åµï¼ï¼
```java
Path filePath1 = Files.createTempFile("file1", ".txt");
Path filePath2 = Files.createTempFile("file2", ".txt");
Files.writeString(filePath1, "Java 12 Article");
Files.writeString(filePath2, "Java 12 Article");
long mismatch = Files.mismatch(filePath1, filePath2);
assertEquals(-1, mismatch);
```
代ç 示ä¾ï¼ä¸¤ä¸ªæä»¶å
容ä¸ç¸åçæ
åµï¼ï¼
```java
Path filePath3 = Files.createTempFile("file3", ".txt");
Path filePath4 = Files.createTempFile("file4", ".txt");
Files.writeString(filePath3, "Java 12 Article");
Files.writeString(filePath4, "Java 12 Tutorial");
long mismatch = Files.mismatch(filePath3, filePath4);
assertEquals(8, mismatch);
```
### NumberFormat å¢å¼º
Java 12 ä¸ `NumberFormat` æ°å¢äºå¯¹å¤æçæ°åè¿è¡æ ¼å¼åçæ¯æï¼
```java
NumberFormat fmt = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT);
String result = fmt.format(1000);
System.out.println(result);
```
è¾åº:
```plain
1K
```
### Socket API å¢å¼º
Java 13 å° Socket API çåºå±è¿è¡äºéåï¼ `NioSocketImpl` æ¯å¯¹ `PlainSocketImpl` çç´æ¥æ¿ä»£ï¼å®ä½¿ç¨ `java.util.concurrent` å
ä¸çéè䏿¯åæ¥æ¹æ³ã妿è¦ä½¿ç¨æ§å®ç°ï¼è¯·ä½¿ç¨ `-Djdk.net.usePlainSocketImpl=true`ã
å¹¶ä¸ï¼å¨ Java 13 䏿¯é»è®¤ä½¿ç¨æ°ç Socket å®ç°ã
```java
public final class NioSocketImpl extends SocketImpl implements PlatformSocketImpl {
}
```
### FileSystems å¢å¼º
Java 13 ä¸ `FileSystems` ç±»ä¸æ·»å äºä»¥ä¸ä¸ç§æ°æ¹æ³ï¼ä»¥ä¾¿æ´å®¹æå°ä½¿ç¨å°æä»¶å
容è§ä¸ºæä»¶ç³»ç»çæä»¶ç³»ç»æä¾ç¨åºï¼
- `newFileSystem(Path)`
- `newFileSystem(Path, Map