Java 15 在 2020 年 9 月发布,虽然不是长久支持版本,但是也带来了 14 个新功能,这些新功能中有不少是十分实用的。

Java 15 官方下载:Archived OpenJDK GA Releases

Java 15 官方文档:JDK 15

Java 15 新功能:

JEP 描述
JEP 339 爱德华曲线算法(EdDSA)
JEP 360 Sealed Classes(密封类)预览
JEP 371 Hidden Classes(隐藏类)
JEP 372 移除 Nashorn JavaScript 引擎
JEP 373 重新实现 DatagramSocket APII
JEP 374 禁用和废弃偏向锁(Biased Locking)
JEP 375 instanceof 类型匹配 (二次预览)
JEP 377 ZGC: 可扩展低延迟垃圾收集器(正式发布)
JEP 378 文本块
JEP 379 Shenandoah: 低停顿时间的垃圾收集器
JEP 381 删除 Solaris 和 SPARC 端口 
JEP 383 外部内存访问 API(第二个孵化器))
JEP 384 Records (二次预览)
JEP 385 废弃 RMI 激活机制

1. JEP 339 爱德华曲线算法(EdDSA)

Java 15 中增加了一个新的密码学算法,爱德华曲线算法(EdDSA)签名算法。它是由 Schnorr 算法发展而来,在 RFC8032 中被定义实现。

package com.wuliyouguocheng;import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.Signature;
import java.security.SignatureException;
import java.util.Base64;public class JEP339 {public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {KeyPairGenerator kpg = KeyPairGenerator.getInstance("Ed25519");KeyPair kp = kpg.generateKeyPair();byte[] msg = "wuliyouguocheng".getBytes(StandardCharsets.UTF_8);Signature sig = Signature.getInstance("Ed25519");sig.initSign(kp.getPrivate());sig.update(msg);byte[] s = sig.sign();System.out.println(Base64.getEncoder().encodeToString(s));}
}

输出结果:

VXlpxapU+LSWjVQ0QNJvdpUh6VI6PjSwOQ2pHu65bCfnLR13OyWKunlc9rc+7SMxCh2Mnqf7TmC/iOG8oimbAw==

2. JEP 360:Sealed Classes(密封类)预览

我们都知道,在 Java 中如果想让一个类不能被继承和修改,这时我们应该使用 final 关键字对类进行修饰。不过这种要么可以继承,要么不能继承的机制不够灵活,有些时候我们可能想让某个类可以被某些类型继承,但是又不能随意继承,是做不到的。Java 15 尝试解决这个问题,引入了 sealed 类,被 sealed 修饰的类可以指定子类。这样这个类就只能被指定的类继承。

而且 sealed 修饰的类的机制具有传递性,它的子类必须使用指定的关键字进行修饰,且只能是 finalsealednon-sealed 三者之一。

示例:犬类(Dog)只能被牧羊犬(Collie)和田园犬(TuGou)继承,使用 sealed 关键字。

package com.wuliyouguocheng;public  sealed interface Dog permits Collie, TuGou {//...
}

牧羊犬(Collie)只能被边境牧羊犬(BorderCollie)继承。

package com.wuliyouguocheng;/*** 牧羊犬* @author wuliyouguocheng*/
public sealed class Collie implements Dog permits BorderCollie {}

边境牧羊犬(BorderCollie)不能被继承,使用 final 关键字。

package com.wuliyouguocheng;/**** @author wuliyouguocheng*/
public final class BorderCollie extends Collie{
}

田园犬(ToGou)可以被任意继承,使用 non-sealed 关键字。

package com.wuliyouguocheng;/*** @author wuliyouguocheng*/
public non-sealed class TuGou implements Dog {
}

3. JEP 371:Hidden Classes(隐藏类)

这个特性让开发者可以引入一个无法被其他地方发现使用,且类的生命周期有限的类。这对运行时动态生成类的使用方式十分有利,可以减少内存占用,下面是一个使用示例。

package com.wuliyouguocheng;public class JEP371Test {public static String lookup() {return "wuliyouguocheng";}
}

把类 JEP371Test 编译后的 Class 转换成 Base64,然后使用 Java 15 新特性加载调用类中的 lookup 方法。

package com.wuliyouguocheng;import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.util.Base64;/*** @author wuliyouguocheng*/
public class JEP371 {private static String CLASS_INFO = "yv66vgAAADQAFAoAAgADBwAEDAAFAAYBABBqYXZhL2xhbmcvT2JqZWN0AQAGPGluaXQ+AQADKClWCAAIAQAOd3d3LndkYnl0ZS5jb20HAAoBABVjb20vd2RieXRlL0pFUDM3MVRlc3QBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAF0xjb20vd2RieXRlL0pFUDM3MVRlc3Q7AQAGbG9va3VwAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAApTb3VyY2VGaWxlAQAPSkVQMzcxVGVzdC5qYXZhACEACQACAAAAAAACAAEABQAGAAEACwAAAC8AAQABAAAABSq3AAGxAAAAAgAMAAAABgABAAAAAwANAAAADAABAAAABQAOAA8AAAAJABAAEQABAAsAAAAbAAEAAAAAAAMSB7AAAAABAAwAAAAGAAEAAAAEAAEAEgAAAAIAEw==";public static void main(String[] args) throws Throwable {byte[] classInBytes = Base64.getDecoder().decode(CLASS_INFO);Class<?> proxy = MethodHandles.lookup().defineHiddenClass(classInBytes, true, MethodHandles.Lookup.ClassOption.NESTMATE).lookupClass();System.out.println(proxy.getName());MethodHandle mh = MethodHandles.lookup().findStatic(proxy, "lookup", MethodType.methodType(String.class));String result = (String) mh.invokeExact();System.out.println(result);}
}

输出结果:

com.wuliyouguocheng.JEP371Test/0x0000000800c01800
wuliyouguocheng

4. JEP 372:移除 Nashorn JavaScript 引擎

Nashorn JavaScript 引擎在 Java 8 中被引入,在 Java 11 中被标记为废弃。由于 ECMAScript 语言发展很快,维护 Nashorn JavaScript 的成本过于高昂,在 Java 15 中被彻底删除。

5. JEP 373:重新实现 DatagramSocket API

Java 13 中重新实现了旧的 Socket API,在介绍 Java 13 时还有一部分做了这方面的介绍。

现在,Java 15 重新实现了遗留的 DatagramSocket

6. JEP 374:禁用和废弃偏向锁(Biased Locking)

在之前,JVM 在处理同步操作,如使用 synchronized 同步时,有一套锁的升级机制,其中有一个锁机制就是偏向锁。然而通过目前的 Java 开发环境来看,使用这些被 synchronized 同步的类的机会并不多,如开发者更喜欢使用 HashMap 或者 ArrayList 而非 HashTableVector

即使换个角度,当初使用偏向锁是为了提高性能,如今看来性能提升的程度和使用次数都不太有用。而偏向锁的引入增加了 JVM 的复杂性。

所以现在偏向锁被默认禁用,在不久的将来将会彻底删除,对于 Java 15,我们仍然可以使用 -XX:+UseBiasedLocking 启用偏向锁定,但它会提示 这是一个已弃用的 API。

7. JEP 375:instanceof 类型匹配 (二次预览)

instanceof 类型匹配在 Java 14 中已经改进,这次仅仅再次预览,没有任何改动,用于接受更多的使用反馈。这个特性在 Java 16 中成为正式特性。

在之前,使用 instanceof 进行类型判断之后,需要进行对象类型转换后才能使用。

package com.wuliyouguocheng;import java.util.ArrayList;
import java.util.List;public class Java14BeaforInstanceof {public static void main(String[] args) {Object obj = new ArrayList<>();if (obj instanceof ArrayList) {ArrayList list = (ArrayList)obj;list.add("wuliyouguocheng");}System.out.println(obj);}
}

而在 Java 14 中,可以在判断类型时指定变量名称进行类型转换,方便了使用。

package com.wuliyouguocheng;import java.util.ArrayList;public class Java14Instanceof {public static void main(String[] args) {Object obj = new ArrayList<>();if (obj instanceof ArrayList list) {list.add("wuliyouguocheng");}System.out.println(obj);}
}

可以看到,在使用 instanceof 判断类型成立后,会自动强制转换类型为指定类型。

输出结果:

[wuliyouguocheng]

8. JEP 377:ZGC: 可扩展低延迟垃圾收集器(正式发布)

ZGC 垃圾收集器在 Java 11 中被引入,但是因为收集器的复杂性,当初决定逐渐引入。然后不断的听取用户的反馈建议修复问题。而现在,已经很久没有收到用户的问题反馈了,ZGC 是时候投入正式使用阶段了。所以在 Java 15 中 ZGC 正式发布,可以使用下面的参数启用 ZGC。

$ java -XX:+UseZGC className

9. JEP 378: 文本块

文本块在 Java 12 中引入,在 Java 13 中开始预览,在 Java 14 二次预览,而现在,在 Java 15 ,文本块是正式的功能特性了。

String content = """{"upperSummary": null,\"sensitiveTypeList": null,"gmtModified": "2022-11-01\s10:50:09",}""";
System.out.println(content);

10. JEP 379:Shenandoah: 低停顿时间的垃圾收集器

Shenandoah 垃圾收集器在 Java 12 中开始引入,Java 15 中成为了正式功能的一部分,可以使用下面的参数启用 Shenandoah 垃圾收集器。

java -XX:+UseShenandoahGC

但是 openJDK 15 中默认是没有 Shenandoah 收集器,想要使用此功能可以下载

AdoptOpenJDK - Open source, prebuilt OpenJDK binaries

为什么 openJDK 中没有 Shenandoah 垃圾收集器?

Shenandoah 是一个高性能、低暂停时间的垃圾收集器,它是 Red Hat 主导的项目。当 Red Hat 第一次提议将 Shenandoah 贡献给 OpenJDK 时,Oracle 明确表示不想支持它,OpenJDK 作为一个免费软件,不想支持 Red Hat 的 Shenandoah 完全没有问题。

最后 Red Hat 选择和 Oracle 合作设计一个真正干净的可插拔垃圾收集器接口,允许任何人轻松选择垃圾收集器以包含在他们的构建中。最终 Shenandoah 进入了 JDK 12,但是没有构建进 OpenJDK。

11. JEP 384:Records(二次预览)

在 Java 14 中引入了 Record 类,Java 15 中对 Record 进行了增强。使它可以支持密封类型、Record 注解以及相关的反射 API 等。

示例:Record 支持密封(sealed)类型。

package com.wuliyouguocheng;/*** @author wuliyouguocheng*/
public sealed interface DataBase permits DataBaseSelect, DataBaseUpdate {
}final record DataBaseSelect(@Deprecated String table, String sql) implements DataBase {
}final record DataBaseUpdate() implements DataBase {
}

java.lang.Class 增加了两个公共方法用于获取 Record 类信息:

  1. RecordComponent[] getRecordComponents()

  2. boolean isRecord()

其他更新

JEP 381:删除 Solaris 和 SPARC 端口

Java 14 JEP 362

(opens new window) 弃用了 Solaris/SPARC、Solaris/x64 和 Linux/SPARC 端口,现在它在 Java 15 中被正式删除。

JEP 383:外部内存访问 API(第二个孵化器)

JEP 385:废弃 RMI 激活机制

只是废弃 RMI 激活机制,不影响 RMI 其他功能。

Java 版本任你发,我用Java8.(Java 15 新功能介绍 )相关推荐

  1. java update 8_版本任你发,我用Java 8!JDK的更新,改变了哪些你写代码的方式?...

    前几天,JDK 14 正式发布了,这次发布的新版本一共包含了16个新的特性. 其实,从Java8 到 Java14 ,真正的改变了程序员写代码的方式的特性并不多,我们这篇文章就来看一下都有哪些. La ...

  2. Java SE 8新功能介绍:使用Streams API处理集合

    使用Java SE 8 Streams的代码更干净,易读且功能强大..... 在" Java SE 8新功能介绍"系列的这篇文章中,我们将深入解释和探索代码,以了解如何使用流遍历集 ...

  3. CentOS以及Oracle数据库发展历史及各版本新功能介绍, 便于构造环境时有个对应关系...

    CentOS版本历史 版本 CentOS版本号有两个部分,一个主要版本和一个次要版本,主要和次要版本号分别对应于RHEL的主要版本与更新包,CentOS采取从RHEL的源代码包来构建.例如CentOS ...

  4. Java 14 新功能介绍!

    Java 14 新功能介绍! Java 14预定于3月17日发布.那么,14版究竟有什么新功能,对于整天写代码.维护代码的Java开发者来说,哪些功能最有用呢? 作者 | Raoul-Gabriel ...

  5. Java 17 新功能介绍(LTS)

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

  6. Allegro174版本新功能介绍之和172版本兼容设置

    Allegro174版本新功能介绍之和172版本兼容设置 Allegro升级到了174版本的时候,如果按照常规操作用174版本保存PCB之后,用172版本是无法打开的. 但是174版本开放了一个和17 ...

  7. Java 17正式发布, Oracle宣布免费提供!“版本任你发,我用Java 8”或成历史?...

    Java 最重要的一次更新:JAVA 17 正式发布,这是一个LTS(长期支持)版本,带来了不少有用的新特性.关于Java 17 的一些新特性,有兴趣的可以移步文章 Java 17 新特性确定 . O ...

  8. 选择java版本_新手上路之如何选择Java版本

    导读热词 @ 初入Java坑,有那么多版本的Java,想了解清楚自己到底该下什么版本这个问题,首先得了解清楚LTS与非LTS的区别 LTS与非LTS 每一次去官网下载JDK的时候,当你进入到Java ...

  9. Java基础学习总结(33)——Java8 十大新特性详解

    Java8 十大新特性详解 本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API ...

最新文章

  1. EX2010与EX2013共存迁移01-设计及说明
  2. 机器学习也能套模版:在线选择模型和参数,一键生成demo
  3. cf1512 G - Short Task
  4. C# 繁体,简体互转
  5. Serverless 落地挑战与蚂蚁金服实践
  6. 五四,阿里巴巴新青年了解下?
  7. SpaceEmacs Rocks Day8 学习笔记
  8. UVALive - 4223(hdu 2926)
  9. OkHttp3用法全解析
  10. C#获取电脑硬件信息(CPU ID、主板ID、硬盘ID、BIOS编号)
  11. 中职学生计算机学情分析报告,中职学校学生学情分析及对策
  12. BM3D算法半解,带python代码
  13. svn忽略指定文件或目录
  14. java:xml数据转json
  15. 《非暴力沟通》-马歇尔·卢森堡
  16. 【异常检测论文】Anomaly Detection综述
  17. MarkdownPad 2 HTML 渲染组件出错问题
  18. 如何将pip更新到最新版本
  19. 山东大学论坛的建立(世一大论坛)
  20. 检索 COM 类工厂中 CLSID 为 {XXXX-XXXX-XXX-XXXXX-XXX} 的组件时失败,原因是出现以下错误: 80040154/ ffffdf8f

热门文章

  1. 几个python运维脚本
  2. 德卡D3读卡器C#开发中的填坑记录
  3. 用html3d静态相册带音乐,3D立体动态相册(带背景音乐)HTML+CSS脚本
  4. 0基础学编程需要哪些基础?
  5. plsql 连接 虚拟机Linux下的Oracle数据库 失败
  6. java Long详解
  7. google Map API实现地址解析
  8. Spring MVC 项目中配置log4j 出现错误log4j:ERROR Failed to excute sql com.mysql.jdbc.exceptions.jdbc4.MySQLSynt
  9. 三种方法求最大公约数(C语言版)
  10. 序列化和反序列化二叉树 -----前序,中序,后序,层序