Java 16 正式发布,已经是Java 8的两倍了

java 16 正式发布,标志着java生态系统的又一次重大进展。

Java 16 正式发布

Java 16带来了多项增强功能,其中Vector API(孵化)显著提升了Java在CPU向量计算的性能,为大规模张量计算提供了支持,增强了Java在人工智能领域的应用能力。

此外,Java 16还引入了对C++ 14新特性的支持,使得在JDK中使用C++源代码时可以利用这些新特性。

Java项目从Mercurial迁移到Git,顺应了代码版本管理领域的趋势。同时,OpenJDK的代码现在由GitHub托管,进一步推动了开源社区的协作。

ZGC垃圾收集器引入了并发线程堆栈处理,提高了垃圾回收的效率。Unix域套接字通道则为

ServerSocketChannel
SocketChannel
提供了Unix域套接字的支持。

Java 16还将JDK移植到了Alpine Linux以及其他使用musl C库的Linux发行版上,支持x64和AArch64架构。此外,Elastic Metaspace对Hotspot的类元数据处理进行了优化,减少了占用空间,并加快了未使用内存的回收速度。

Windows/AArch64平台也迎来了JDK的移植,进一步扩展了Java的应用范围。

Foreign Linker API(孵化)提供了一个API,允许纯Java访问本地代码,结合Foreign-Memory API(JEP 393),简化了绑定到本地库的过程。

对于基于值的类,Java 16引入了新的警告机制,提示开发者避免在这些类上进行同步操作,并弃用其构造函数。

jpackage
工具的引入使得打包独立Java应用程序变得更加简单,支持本地打包格式如Windows上的
msi
exe
、MacOS上的
pkg
dmg
、Linux上的
deb
rpm
,提供自然的安装体验。

Foreign-Memory Access API(第三次孵化)允许Java程序安全有效地访问Java堆之外的外部内存。

在模式匹配方面,Java 16引入了对

instanceof
的自动匹配模式,简化了类型判断和转换的过程:

// 传统方式
if (obj instanceof String) {
    String s = (String) obj;
    // 使用s
}

// 自动匹配模式 if (obj instanceof String s) { // 如果类型匹配,直接使用s } else { // 如果类型不匹配,则不能直接使用 }

Records Class正式成为Java的一部分,使得类的定义更加简洁:

// 传统定义
public class Range {
private final int min;
private final int max;
public Range(int min, int max) {
this.min = min;
this.max = max;
}
public int getMin() { return min; }
public int getMax() { return max; }
@Override public boolean equals(Object o) { / 实现 / }
@Override public int hashCode() { / 实现 / }
@Override public String toString() { / 实现 / }
}

// 使用Records简化 public record Range(int min, int max) {}

更多关于Records的信息,可以参考Java 14的新特性介绍:JEP 359: Records(Preview)。

默认情况下,Java 16提高了JDK的严格封装,提升了安全性和可维护性,这主要影响JDK的开发者而非普通用户。

Sealed Classes(密封类)类似于被

final
修饰的类,不能被继承,防止了恶意的派生。

Oracle发布了对参与JDK 16贡献的公司和个人的感谢声明。