--- title: Java 16 æ°ç¹æ§æ¦è§ category: Java tag: - Javaæ°ç¹æ§ --- ## Java 16 ### è®°å½ç±»åï¼è½¬æ£ï¼ åæ´åå²ï¼ | JDK çæ¬ | æ´æ°ç±»å | JEP | æ´æ°å 容 | | ---------- | ----------------- | -------------------------------------------- | ------------------------------------------------------------ | | Java SE 14 | Preview | [JEP 359](https://openjdk.java.net/jeps/359) | å¼å ¥ `record` å ³é®åï¼`record` æä¾ä¸ç§ç´§åçè¯æ³æ¥å®ä¹ç±»ä¸çä¸å¯åæ°æ®ã | | Java SE 15 | Second Preview | [JEP 384](https://openjdk.org/jeps/384) | æ¯æå¨å±é¨æ¹æ³åæ¥å£ä¸ä½¿ç¨ `record`ã | | Java SE 16 | Permanent Release | [JEP 395](https://openjdk.org/jeps/395) | ééæå é¨ç±»å¯ä»¥å®ä¹é常éçéææåã | ä» Java SE 16 å¼å§ï¼ééæå é¨ç±»å¯ä»¥å®ä¹é常éçéææåã ```java public class Outer { class Inner { static int age; } } ``` > å¨ JDK 16 ä¹åï¼å¦æåä¸é¢è¿ç§ä»£ç ï¼IDE ä¼æç¤ºä½ éæå段 age ä¸è½å¨ééæçå é¨ç±»ä¸å®ä¹ï¼é¤éå®ç¨ä¸ä¸ªå¸¸é表达å¼åå§åãï¼The field age cannot be declared static in a non-static inner type, unless initialized with a constant expressionï¼ ### instanceof 模å¼å¹é ï¼è½¬æ£ï¼ | JDK çæ¬ | æ´æ°ç±»å | JEP | æ´æ°å 容 | | ---------- | ----------------- | --------------------------------------- | ---------------------------------------- | | Java SE 14 | preview | [JEP 305](https://openjdk.org/jeps/305) | 馿¬¡å¼å ¥ instanceof 模å¼å¹é ã | | Java SE 15 | Second Preview | [JEP 375](https://openjdk.org/jeps/375) | ç¸æ¯è¾ä¸ä¸ªçæ¬æ ååï¼ç»§ç»æ¶éæ´å¤åé¦ã | | Java SE 16 | Permanent Release | [JEP 394](https://openjdk.org/jeps/394) | 模å¼åéä¸å¨éå¼ä¸º finalã | ä» Java SE 16 å¼å§ï¼ä½ å¯ä»¥å¯¹ instanceof ä¸çåéå¼è¿è¡ä¿®æ¹ã ```java public void learn(Object obj) { if (obj instanceof String s) { System.out.println(s); s = "JavaGuide"; System.out.println(s); } } ``` ### é¢è§æ°ç¹æ§ #### å¯å°ç±» å¨ JDK 15 å¼å ¥ç sealed classï¼å¯å°ç±»ï¼å¨ JDK 16 å¾å°äºæ¹è¿ï¼æ´å ä¸¥æ ¼çå¼ç¨æ£æ¥åå¯å°ç±»çç»§æ¿å ³ç³»ã ### å ¶ä»ä¼å䏿¹è¿ - **ä¼å JavaDoc çæç´¢åè½** ï¼å¯¹äºåè¯å¤§å°åé®é¢çæ¹è¿ï¼å½ä¸ç¥éå ·ä½æ¼åæè 大å°åçæ¶å徿ç¨ã - **ZGC å¹¶å线ç¨å¤ç** ï¼JEP 376 å° ZGC çº¿ç¨æ å¤çä»å®å ¨ç¹è½¬ç§»å°ä¸ä¸ªå¹¶åé¶æ®µï¼çè³å¨å¤§å ä¸ä¹å è®¸å¨æ¯«ç§å æå GC å®å ¨ç¹ãæ¶é¤ ZGC å徿¶éå¨ä¸æåä¸ä¸ªå»¶è¿æºå¯ä»¥æå¤§å°æé«åºç¨ç¨åºçæ§è½åæçã - **å¼¹æ§å 空é´** ï¼æ¤ç¹æ§å¯å°æªä½¿ç¨ç HotSpot ç±»å æ°æ®ï¼å³å 空é´ï¼metaspaceï¼å åæ´å¿«éå°è¿åå°æä½ç³»ç»ï¼ä»èåå°å 空é´çå ç¨ç©ºé´ãå ·æå¤§éç±»å è½½åå¸è½½æ´»å¨çåºç¨ç¨åºå¯è½ä¼å ç¨å¤§éæªä½¿ç¨ç空é´ãæ°æ¹æ¡å°å 空é´å åæè¾å°çååé ï¼å®å°æªä½¿ç¨çå 空é´å åè¿åç»æä½ç³»ç»æ¥æé«å¼¹æ§ï¼ä»èæé«åºç¨ç¨åºæ§è½å¹¶éä½å åå ç¨ã - **Unix-Domain 奿¥åéé** ï¼Unix-domain 奿¥åä¸ç´æ¯å¤§å¤æ° Unix å¹³å°çä¸ä¸ªç¹æ§ï¼ç°å¨å¨ Windows 10 å Windows Server 2019 乿ä¾äºæ¯æãæ¤ç¹æ§ä¸º java.nio.channels å ç奿¥åééåæå¡å¨å¥æ¥åéé API æ·»å äº Unix-domainï¼AF_UNIXï¼å¥æ¥åæ¯æã宿©å±äºç»§æ¿çééæºå¶ä»¥æ¯æ Unix-domain 奿¥åééåæå¡å¨å¥æ¥åééãUnix-domain 奿¥åç¨äºåä¸ä¸»æºä¸çè¿ç¨é´éä¿¡ï¼IPCï¼ãå®ä»¬å¨å¾å¤§ç¨åº¦ä¸ç±»ä¼¼äº TCP/IPï¼åºå«å¨äºå¥æ¥åæ¯éè¿æä»¶ç³»ç»è·¯å¾åè䏿¯ Internet åè®®ï¼IPï¼å°åå端å£å·å¯»åçãå¯¹äºæ¬å°è¿ç¨é´éä¿¡ï¼Unix-domain 奿¥åæ¯ TCP/IP ç¯åè¿æ¥æ´å®å ¨ãæ´ææã - **æå å·¥å ·**ï¼æ¤ç¹æ§æåæ¯ä½ä¸º Java 14 ä¸çä¸ä¸ªåµå卿¨¡åå¼å ¥çï¼è¯¥å·¥å ·å 许æå èªå å«ç Java åºç¨ç¨åºã宿¯æåçæå æ ¼å¼ï¼ä¸ºæç»ç¨æ·æä¾èªç¶çå®è£ ä½éªï¼è¿äºæ ¼å¼å æ¬ Windows ä¸ç msi å exeãmacOS ä¸ç pkg å dmgï¼è¿æ Linux ä¸ç deb å rpmãå®è¿å è®¸å¨æå æ¶æå®å¯å¨æ¶åæ°ï¼å¹¶ä¸å¯ä»¥ä»å½ä»¤è¡ç´æ¥è°ç¨ï¼ä¹å¯ä»¥éè¿ ToolProvider API 以ç¼ç¨æ¹å¼è°ç¨ã注æ jpackage 模ååç§°ä» jdk.incubator.jpackage æ´æ¹ä¸º jdk.jpackageãè¿å°æ¹åæç»ç¨æ·å¨å®è£ åºç¨ç¨åºæ¶çä½éªï¼å¹¶ç®åäºâåºç¨ååºâ模åçé¨ç½²ã - **对åºäºå¼çç±»ååºè¦å**ï¼æ¤ç¹æ§å°åå§å è£ å¨ç±»ï¼java.lang.Integerãjava.lang.Double çï¼æå®ä¸ºåºäºå¼çï¼ç±»ä¼¼äº java.util.Optional å java.time.LocalDateTimeï¼ï¼å¹¶å¨å ¶æé å¨ä¸æ·»å forRemovalï¼èª JDK 9 å¼å§è¢«å¼ç¨ï¼ï¼è¿æ ·ä¼æç¤ºæ°çè¦åãå¨ Java å¹³å°ä¸å°è¯å¨ä»»ä½åºäºå¼çç±»çå®ä¾ä¸è¿è¡ä¸æ£ç¡®ç忥æ¶ï¼å®ä¼ååºè¦åã - **é»è®¤å¼ºå°è£ JDK å é¨å ç´ **ï¼æ¤ç¹æ§ä¼é»è®¤å¼ºå°è£ JDK çææå é¨å ç´ ï¼ä½å ³é®å é¨ APIï¼ä¾å¦ sun.misc.Unsafeï¼é¤å¤ãé»è®¤æ åµä¸ï¼ä½¿ç¨æ©æçæ¬æåç¼è¯çè®¿é® JDK å é¨ API ç代ç å¯è½ä¸åèµ·ä½ç¨ãé¼å±å¼å人åä»ä½¿ç¨å é¨å ç´ è¿ç§»å°ä½¿ç¨æ å API çæ¹æ³ä¸ï¼ä»¥ä¾¿ä»ä»¬åå ¶ç¨æ·é½å¯ä»¥æ ç¼å级å°å°æ¥ç Java çæ¬ã强å°è£ ç± JDK 9 çå¯å¨å¨é项âillegal-access æ§å¶ï¼å° JDK 15 é»è®¤æ¹ä¸º warningï¼ä» JDK 16 å¼å§é»è®¤ä¸º denyãï¼ç®åï¼ä»ç¶å¯ä»¥ä½¿ç¨å个å½ä»¤è¡é项æ¾å®½å¯¹ææè½¯ä»¶å çå°è£ ï¼å°æ¥åªæä½¿ç¨âadd-opens æå¼ç¹å®çè½¯ä»¶å æè¡ã - **åé APIï¼åµåå¨ï¼**ï¼è¯¥åµåå¨ API æä¾äºä¸ä¸ª API çåå§è¿ä»£ä»¥è¡¨è¾¾ä¸äºåé计ç®ï¼è¿äºè®¡ç®å¨è¿è¡æ¶å¯é å°ç¼è¯ä¸ºæ¯æç CPU æ¶æä¸çæä½³åé硬件æä»¤ï¼ä»èè·å¾ä¼äºåçæ é计ç®çæ§è½ï¼å åå©ç¨åæä»¤å¤æ°æ®ï¼SIMDï¼ææ¯ï¼å¤§å¤æ°ç°ä»£ CPU ä¸é½å¯ä»¥ä½¿ç¨çä¸ç§æä»¤ï¼ã尽管 HotSpot æ¯æèªå¨åéåï¼ä½æ¯å¯è½¬æ¢çæ éæä½éæé䏿åä»£ç æ´æ¹çå½±åã该 API å°ä½¿å¼å人åè½å¤è½»æ¾å°ç¨ Java ç¼åå¯ç§»æ¤ç髿§è½åéç®æ³ã - **å¤é¨é¾æ¥å¨ APIï¼åµåå¨ï¼**ï¼è¯¥åµåå¨ API æä¾äºéæç±»åã纯 Java 访é®åç代ç çç¹æ§ï¼è¯¥ API å°å¤§å¤§ç®åç»å®åçåºç忬夿ä¸å®¹æåºéçè¿ç¨ãJava 1.1 就已éè¿ Java åçæ¥å£ï¼JNIï¼æ¯æäºåçæ¹æ³è°ç¨ï¼ä½å¹¶ä¸å¥½ç¨ãJava å¼å人ååºè¯¥è½å¤ä¸ºç¹å®ä»»å¡ç»å®ç¹å®çåçåºãå®è¿æä¾äºå¤æ¥å½æ°æ¯æï¼èæ éä»»ä½ä¸é´ç JNI ç²å代ç ã - **å¤é¨åå¨å¨è®¿é® API**ï¼å¨ Java 14 å Java 15 ä¸ä½ä¸ºåµåå¨ API å¼å ¥çè¿ä¸ª API 使 Java ç¨åºè½å¤å®å ¨ææå°å¯¹åç§å¤é¨åå¨å¨ï¼ä¾å¦æ¬æºåå¨å¨ãæä¹ æ§åå¨å¨ãæç®¡å åå¨å¨çï¼è¿è¡æä½ã宿ä¾äºå¤é¨é¾æ¥å¨ API çåºç¡ã - **å¯ç¨ C++14 è¯è¨ç¹æ§** ï¼å®å è®¸å¨ JDK C++ æºä»£ç ä¸ä½¿ç¨ C++14 è¯è¨ç¹æ§ï¼å¹¶æä¾å¨ HotSpot 代ç ä¸å¯ä»¥ä½¿ç¨åªäºç¹æ§çå ·ä½æå¯¼ãå¨ JDK 15 ä¸ï¼JDK ä¸ C++ 代ç 使ç¨çè¯è¨ç¹æ§ä» éäº C++98/03 è¯è¨æ åãå®è¦æ±æ´æ°åç§å¹³å°ç¼è¯å¨çæä½å¯æ¥åçæ¬ã - **AlpineLinux ç§»æ¤ï¼JEP 388ï¼Windows/AArch64 ç§»æ¤** ï¼è¿äº JEP çéç¹ä¸æ¯ç§»æ¤å·¥ä½æ¬èº«ï¼èæ¯å°å®ä»¬éæå° JDK 主线åå¨åºä¸ï¼JEP 386 å° JDK ç§»æ¤å° Alpine Linux åå ¶ä»ä½¿ç¨ musl ä½ä¸º x64 ä¸ä¸»è¦ C åºçåè¡çä¸ãæ¤å¤ï¼JEP 388 å° JDK ç§»æ¤å° Windows AArch64ï¼ARM64ï¼ã ### åèæç® - [Java Language Changes](https://docs.oracle.com/en/java/javase/16/language/java-language-changes.html) - [Consolidated JDK 16 Release Notes](https://www.oracle.com/java/technologies/javase/16all-relnotes.html) - [Java 16 æ£å¼åå¸ï¼æ°ç¹æ§ä¸ä¸è§£æ](https://www.infoq.cn/article/IAkwhx7i9V7G8zLVEd4L)