前言
就在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安裝包和官方指導文件。