官方正式發佈 Java 16
前言
就在2021/03/16,官方正式發佈了Java 16。我們可以下載使用Java 16了。
特性
向量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編程語言。模式匹配允許程序中的公共邏輯,即從對象中有條件地提取組件,以更簡潔和更安全的方式表達。
以前我們使用是這樣的,先判斷類型,再強制轉換。
if (obj instanceof String) {
String s = (String) obj;
...
}
Java 16中,可以這樣使用了,直接使用遍歷s。
if (obj instanceof String s) {
// 可以直接使用s
...
}
還可以這樣使用,但是前提是第一個判斷成立,第二個才能正確執行,所以可以使用&&,不能使用||。
if (obj instanceof String s && s.length() > 5) {
flag = s.contains("jdk");
}
Records
用Records關鍵字增強Java編程語言,Records作為不可變數據透明載體的類。
以前我們定義一個類是這樣的,如下:
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中,只需要簡潔的如下定義:
record Point(int x, int y) { }
默認情況下對JDK內部進行強封裝
默認情況下,強烈封裝JDK的所有內部元素,除了關鍵的內部api,如sun.misc.Unsafe。允許最終用戶選擇寬鬆的強封裝,這是自JDK 9以來的默認封裝。提高了JDK的安全性和可維護性。
Sealed Classes
使用密封的類和接口增強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安裝包和官方指導文檔。