前言

就在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编程语言。模式匹配允许程序中的公共逻辑,即从对象中有条件地提取组件,以更简洁和更安全的方式表达。

以前我们使用是这样的,先判断类型,再强制转换。

  1. if (obj instanceof String) {
  2. String s = (String) obj;
  3. ...
  4. }

Java 16中,可以这样使用了,直接使用遍历s。

  1. if (obj instanceof String s) {
  2. // 可以直接使用s
  3. ...
  4. }

还可以这样使用,但是前提是第一个判断成立,第二个才能正确执行,所以可以使用&&,不能使用||。

  1. if (obj instanceof String s && s.length() > 5) {
  2. flag = s.contains("jdk");
  3. }

Records

用Records关键字增强Java编程语言,Records作为不可变数据透明载体的类。

以前我们定义一个类是这样的,如下:

  1. class Point {
  2. private final int x;
  3. private final int y;
  4. Point(int x, int y) {
  5. this.x = x;
  6. this.y = y;
  7. }
  8. int x() { return x; }
  9. int y() { return y; }
  10. public boolean equals(Object o) {
  11. if (!(o instanceof Point)) return false;
  12. Point other = (Point) o;
  13. return other.x == x && other.y == y;
  14. }
  15. public int hashCode() {
  16. return Objects.hash(x, y);
  17. }
  18. public String toString() {
  19. return String.format("Point[x=%d, y=%d]", x, y);
  20. }
  21. }

在Java 16中,只需要简洁的如下定义:

  1. record Point(int x, int y) { }

默认情况下对JDK内部进行强封装

默认情况下,强烈封装JDK的所有内部元素,除了关键的内部api,如sun.misc.Unsafe。允许最终用户选择宽松的强封装,这是自JDK 9以来的默认封装。提高了JDK的安全性和可维护性。

Sealed Classes

使用密封的类和接口增强Java编程语言。密封的类和接口限制了其他类或接口可以扩展或实现它们。

  1. public abstract sealed class SealedHuman permits Student, Teacher {
  2. protected final String name;
  3. public abstract void speak();
  4. public SealedHuman(String name) {
  5. this.name = name;
  6. }
  7. }
  8. public final class Student extends SealedHuman {
  9. public Student(String name) {
  10. super(name);
  11. }
  12. public void speak() {
  13. System.out.println("student name:" + name);
  14. }
  15. public void study() {
  16. System.out.println(name +" is studying");
  17. }
  18. }
  19. public final class Teacher extends SealedHuman {
  20. public Teacher(String name) {
  21. super(name);
  22. }
  23. public void speak() {
  24. System.out.println("Teacher name:" + name);
  25. }
  26. public void teach() {
  27. System.out.println(name +"is teache");
  28. }
  29. }

提前尝试Java 16新特性,关注如下公众号,添加作者获取Java 16安装包和官方指导文档。

官方正式发布 Java 16的更多相关文章

  1. Java 16 新功能介绍

    点赞再看,动力无限.Hello world : ) 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 程序猿阿朗博客 已经收录,有很多知识点和系列文章. Ja ...

  2. MD5、SHA1加密java 16位32位

    MD5.SHA1加密java 16位32位 import java.math.BigInteger; import java.security.MessageDigest; public class ...

  3. java 16进制与字符串直接相互转换

      java 16进制与字符串直接相互转换 CreationTime--2018年7月12日09点39分 Author:Marydon 1.16进制转换成字符串 /** * 16进制直接转换成为字符串 ...

  4. 实战 Java 16 值类型 Record - 2. Record 的基本用法

    在上一篇文章实战 Java 16 值类型 Record - 1. Record 的默认方法使用以及基于预编译生成相关字节码的底层实现中,我们详细分析了 Record 自带的属性以及方法和底层字节码与实 ...

  5. Java 16 中新增的 Stream 接口的一些思考

    这里先提一个题外话,如果想看 JDK 不同版本之间有何差异,增加或者删除了哪些 API,可以通过下面这个链接查看: https://javaalmanac.io/jdk/17/apidiff/11/ ...

  6. JEP解读与尝鲜系列4 - Java 16 中对于 Project Valhalla 的铺垫

    这是 JEP 解读与尝鲜系列的第 4 篇,之前的文章如下: JEP解读与尝鲜系列 1 - Java Valhalla与Java Inline class JEP解读与尝鲜系列 2 - JEP 142 ...

  7. Java 16 新特性:instanceof增强

    instanceof这个关键词,主要用来判断某个对象是不是某个类的实例. 比如,有时候我们要处理一个类似这样的数据集: Map<String, Object> data = new Has ...

  8. Java 16 新特性:record类

    以前我们定义类都是用class关键词,但从Java 16开始,我们将多一个关键词record,它也可以用来定义类.record关键词的引入,主要是为了提供一种更为简洁.紧凑的final类的定义方式. ...

  9. _00019 Storm架构介绍和Storm获取案例(简单的官方网站Java案例)

    博文作者:妳那伊抹微笑 itdog8 地址链接 : http://www.itdog8.com(个人链接) 博客地址:http://blog.csdn.net/u012185296 博文标题:_000 ...

随机推荐

  1. AbstractQueuedSynchronizer的使用和juc里的相关类的解析

    对AQS进行解析后,先来实现两个简单的基于AQS的类,然后再解析juc里基于AQS构造的类. 1.基于AQS的类的示例 首先先看这个类,这个类是<Java并发编程实战>的一个示例,AQS源 ...

  2. Web API 设计

    Web API 设计 The Design of Web APIs free online ebook https://www.manning.com/books/the-design-of-web- ...

  3. Chrome offline game & source codes hacker

    Chrome offline game & source codes hacker dino === little dinosaur chrome://dino/ 手动 offline htt ...

  4. taro ENV & NODE_ENV & process.env

    taro ENV & NODE_ENV & process.env https://github.com/NervJS/taro-ui/blob/dev/src/common/util ...

  5. ES进行date_histogram时间聚合,聚合结果时间不正确问题

    在做项目中,有一个需求是统计本周内每天的漏洞数量,我选用的是ES中的date_histogram函数来进行聚合统计: 但是出现了一个问题,聚合出来的结果和想要统计的结果时间不一致,如下图所示 时间区间 ...

  6. 智能合约稳定币USDN的价值在哪里?

    近几年来,区块链和数字货币市场快速发展,客观上需要价格相对稳定的交易媒介和贮藏手段,从而推动以链上资产或链下资产抵押型稳定币和算法型稳定币出现,以实现币价相对稳定的数字货币.市场上开始出现了诸如USD ...

  7. NGK项目八大板块是什么?

    公链项目生态各板块中,应用生态繁荣与实体经济联系作为密切,也被看做公链平台追求的终极目标,NGK公链以实体企业粘合客户,致力于重塑金融体系,构建全球区块链生态. NGK让经济权益上链发行,目前已有八大 ...

  8. Github Action 快速上手指南

    前言 各位读者,新年快乐,我是过了年匆忙赶回上海努力搬砖的蛮三刀. Github之前更新了一个Action功能(应该是很久以前了),可以实现很多自动化操作.用来替代用户自己设置的自动化脚本(比如:钩子 ...

  9. epoll 原理

    本文转载自epoll 原理 导语 以前经常被人问道 select.poll.epoll 的区别,基本都是靠死记硬背的,最近正好复习 linux 相关的内容,就把这一块做个笔记吧,以后也能方便查阅. e ...

  10. 最实用JS 留着学习

    1.A标签删除 function input(){    var b = window.confirm("确认要删除本条信息!");    if(b==true){     ret ...