就在2021/03/16,官方正式发布了Java 16。我们可以下载使用Java 16了。
在运行期,Vector 表示向量计算可以可靠地编译成支持CPU架构上的最佳矢量硬件指令,从而实现优于等效标量计算的性能。提升了Java在CPU向量计算的性能。
允许在JDK中C++源代码中使用 C ++ 14的新特性,并给出哪些特性可能在热点代码中使用的具体指导。
将OpenJDK社区的源代码库从Mercurial (hg)迁移到Git。
在GitHub上托管OpenJDK社区的Git仓库。与JEP 357(从Mercurial迁移到Git)一起,这将把所有存储库OpenJDK项目迁移到GitHub上,包括JDK特性版本和版本11及以后的JDK更新版本。
将ZGC线程堆栈处理从安全点移动到并发阶段。
在java.nio.channels包中,为socket channel和server-socket channel api增加Unix-domain(AF_UNIX)套接字支持。
在x64和AArch64架构上,将JDK移植到Alpine Linux和其他使用musl作为主要C库的Linux发行版上。
更及时地将未使用的热点类元数据(即metaspace元空间)内存返回给操作系统,减少元空间的占用,并简化元空间代码,以减少维护成本。
将 JDK 移植到 Windows / AArch64。随着新的消费者级和服务器级AArch64 (ARM64)硬件的发布,Windows/AArch64已经成为终端用户需求的一个重要平台。
引入一个API,该API提供对本机代码的静态类型纯java访问。这个API,与外部内存API (JEP 393),能极大简化绑定到本机库的容易出错的过程。
将原始包装类指定为基于值的类,并弃用它们的构造函数以便删除,并提示新的弃用警告。提供关于在Java平台中任何基于值类的实例上进行同步的警告。
提供jpackage工具,用于打包自包含的Java应用程序。
引入一个API,允许Java程序安全有效地访问Java堆之外的外部内存。
使用对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关键字增强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的所有内部元素,除了关键的内部api,如sun.misc.Unsafe。允许最终用户选择宽松的强封装,这是自JDK 9以来的默认封装。提高了JDK的安全性和可维护性。
使用密封的类和接口增强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"); } }
下一篇:如何查看python版本