1. 程式人生 > >官方正式釋出 Java 16

官方正式釋出 Java 16

# 前言 就在2021/03/16,官方正式釋出了Java 16。我們可以下載使用Java 16了。 ![](https://img-blog.csdnimg.cn/20210317133649231.png?1x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NoZW5saXhpYW8wMDc=,size_16,color_FFFFFF,t_70) # 特性 ## 向量API(孵化) 在執行期,Vector 表示向量計算可以可靠地編譯成支援CPU架構上的最佳向量硬體指令,從而實現優於等效標量計算的效能。提升了Java在CPU向量計算的效能。 ## 啟用c++ 14 語言特性 允許在JDK中C++原始碼中使用 C ++ 14的新特性,並給出哪些特性可能在熱點程式碼中使用的具體指導。 ## 從Mercurial遷移到Git 將OpenJDK社群的原始碼庫從Mercurial (hg)遷移到Git。 ## 遷移到GitHub 在GitHub上託管OpenJDK社群的Git倉庫。與JEP 357(從Mercurial遷移到Git)一起,這將把所有儲存庫OpenJDK專案遷移到GitHub上,包括JDK特性版本和版本11及以後的JDK更新版本。 ## ZGC 併發執行緒堆疊處理 將ZGC執行緒堆疊處理從安全點移動到併發階段。 ## Unix-Domain 套接字通道 在java.nio.channels包中,為socket channel和server-socket channel api增加Unix-domain(AF_UNIX)套接字支援。 ## Alpine Linux Port 在x64和AArch64架構上,將JDK移植到Alpine Linux和其他使用musl作為主要C庫的Linux發行版上。 ## Elastic Metaspace 更及時地將未使用的熱點類元資料(即metaspace元空間)記憶體返回給作業系統,減少元空間的佔用,並簡化元空間程式碼,以減少維護成本。 ## Windows/AArch64 Port 將 JDK 移植到 Windows / AArch64。隨著新的消費者級和伺服器級AArch64 (ARM64)硬體的釋出,Windows/AArch64已經成為終端使用者需求的一個重要平臺。 ## Foreign Linker API(孵化) 引入一個API,該API提供對本機程式碼的靜態型別純java訪問。這個API,與外部記憶體API (JEP 393),能極大簡化繫結到本機庫的容易出錯的過程。 ## 基於值的類的警告 將原始包裝類指定為基於值的類,並棄用它們的建構函式以便刪除,並提示新的棄用警告。提供關於在Java平臺中任何基於值類的例項上進行同步的警告。 ## 打包工具 提供jpackage工具,用於打包自包含的Java應用程式。 ## 外部記憶體訪問API(第三次孵化) 引入一個API,允許Java程式安全有效地訪問Java堆之外的外部記憶體。 ## 為instanceof進行模式匹配 使用對instanceof操作符的模式匹配來增強Java程式語言。模式匹配允許程式中的公共邏輯,即從物件中有條件地提取元件,以更簡潔和更安全的方式表達。 以前我們使用是這樣的,先判斷型別,再強制轉換。 ```java if (obj instanceof String) { String s = (String) obj; ... } ``` Java 16中,可以這樣使用了,直接使用遍歷s。 ```java if (obj instanceof String s) { // 可以直接使用s ... } ``` 還可以這樣使用,但是前提是第一個判斷成立,第二個才能正確執行,所以可以使用&&,不能使用||。 ```java if (obj instanceof String s && s.length() > 5) { flag = s.contains("jdk"); } ``` ## Records 用Records關鍵字增強Java程式語言,Records作為不可變資料透明載體的類。 以前我們定義一個類是這樣的,如下: ```java class Point { private final int x; private final int y; Point(int x, int y) { this.x = x; this.y = y; } int x() { return x; } int y() { return y; } public boolean equals(Object o) { if (!(o instanceof Point)) return false; Point other = (Point) o; return other.x == x && other.y == y; } public int hashCode() { return Objects.hash(x, y); } public String toString() { return String.format("Point[x=%d, y=%d]", x, y); } } ``` 在Java 16中,只需要簡潔的如下定義: ```java record Point(int x, int y) { } ``` ## 預設情況下對JDK內部進行強封裝 預設情況下,強烈封裝JDK的所有內部元素,除了關鍵的內部api,如sun.misc.Unsafe。允許終端使用者選擇寬鬆的強封裝,這是自JDK 9以來的預設封裝。提高了JDK的安全性和可維護性。 ## Sealed Classes 使用密封的類和介面增強Java程式語言。密封的類和介面限制了其他類或介面可以擴充套件或實現它們。 ```java public abstract sealed class SealedHuman permits Student, Teacher { protected final String name; public abstract void speak(); public SealedHuman(String name) { this.name = name; } } public final class Student extends SealedHuman { public Student(String name) { super(name); } public void speak() { System.out.println("student name:" + name); } public void study() { System.out.println(name +" is studying"); } } public final class Teacher extends SealedHuman { public Teacher(String name) { super(name); } public void speak() { System.out.println("Teacher name:" + name); } public void teach() { System.out.println(name +"is teache"); } } ``` **提前嘗試Java 16新特性,關注如下公眾號,新增作者獲取Java 16安裝包和官方指導文件。** ![](https://img-blog.csdnimg.cn/20210317144229498.png)