JDK 15 2020/09/15 如期而至!html
这个时间牛逼啊,和苹果发布会同天?java
OracleJDK 15 发布地址:git
https://www.oracle.com/java/technologies/javase/15all-relnotes.html算法
OpenJDK 15 发布地址:编程
https://openjdk.java.net/projects/jdk/15/安全
OracleJDK 和 OpenJDK 二者的区别这里不撰述了,不清楚的请点击这里进行查看。oracle
如今的 JDK 真变成了“版本帝”,无力吐槽啊,版本发到 15,大部分人却都还在用着 JDK 7/8,甚至 6。不过不要紧,多了解一下,多掌握一点新东西,对你来讲没有坏处。框架
新特性编程语言
JDK 15 新特性一览表:工具
IDJEPFeature1339Edwards-Curve Digital Signature Algorithm (EdDSA)2360Sealed Classes (Preview)3371Hidden Classes4372Remove the Nashorn JavaScript Engine5373Reimplement the Legacy DatagramSocket API6374Disable and Deprecate Biased Locking7375Pattern Matching for instanceof (Second Preview)8377ZGC: A Scalable Low-Latency Garbage Collector9378Text Blocks10379Shenandoah: A Low-Pause-Time Garbage Collector11381Remove the Solaris and SPARC Ports12383Foreign-Memory Access API (Second Incubator)13384Records (Second Preview)14385Deprecate RMI Activation for Removal
JDK 15 一次发布了 14 个新特性,下面带你们来解读下这些新特性!
339:Edwards-Curve Digital Signature Algorithm (EdDSA)
Edwards-Curve 数据签名算法(EdDSA),一种根据 RFC 8032 规范所描述的 Edwards-Curve 数字签名算法(EdDSA)实现加密签名,实现了一种 RFC 8032 标准化方案,但它不能代替 ECDSA。
EdDSA 是一种现代的椭圆曲线签名方案,与 JDK 中现有的签名方案相比,它有不少优点。
360:Sealed Classes (Preview)
封闭类(预览特性),能够是封闭类和或者封闭接口,用来加强 Java 编程语言,防止其余类或接口扩展或实现它们。
这个牛逼啊,有了这个特性,意味着之后不是你想继承就继承,想实现就实现了,你得通过容许才行。
来看这个示例:
public abstract sealed class Student
permits ZhangSan, LiSi, ZhaoLiu {
...
}
类 Student 被 sealed 修饰,说明它是一个封闭类,而且只容许指定的 3 个子类继承。
371:Hidden Classes
隐藏类,这一看也是个颇有意思的特性。
隐藏类是为框架(frameworks)所设计的,隐藏类不能直接被其余类的字节码使用,只能在运行时生成类并经过反射间接使用它们。
372:Remove the Nashorn JavaScript Engine
移除了 Nashorn JavaScript 脚本引擎、APIs,以及 jjs 工具。这些早在 JDK 11 中就已经被标记为 deprecated 了,JDK 15 被移除就很正常了。
Nashorn 是 JDK 1.8 引入的一个 JavaScript 脚本引擎,用来取代 Rhino 脚本引擎。Nashorn 是 ECMAScript-262 5.1 的完整实现,加强了 Java 和 JavaScript 的兼容性,而且大大提高了性能。
为何要移除?
官方的描述是,随着 ECMAScript 脚本语言的结构、API 的改编速度愈来愈快,维护Nashorn 太有挑战性了,因此……。
373:Reimplement the Legacy DatagramSocket API
从新实现了老的 DatagramSocket API 接口,更改了 java.net.DatagramSocket 和 java.net.MulticastSocket 为更加简单、现代化的底层实现,更易于维护和调试。
新的底层实现将很容易使用虚拟线程,目前正在 Loom 项目中进行探索。这也是 JEP 353 的后续更新版本,JEP 353 已经从新实现了 Socket API。
374:Disable and Deprecate Biased Locking
准备禁用和废除偏向锁,在 JDK 15 中,默认状况下禁用偏向锁,并弃用全部相关的命令行选项。
后面再肯定是否须要继续支持偏向锁,国为维护这种锁同步优化的成本过高了。
375:Pattern Matching for instanceof (Second Preview)
模式匹配(第二次预览),第一次预览是 JDK 14 中提出来的
Java 14 以前:
if (object instanceof Kid) {
Kid kid = (Kid) object;
// ...
} else if (object instanceof Kiddle) {
Kid kid = (Kid) object;
// ...
}
Java 14+:
if (object instanceof Kid kid) {
// ...
} else if (object instanceof Kiddle kiddle) {
// ...
}
Java 15 并无对此特性进行调整,继续预览特性,只是为了收集更多的用户反馈,可能还不成熟吧。
377:ZGC: A Scalable Low-Latency Garbage Collector
ZGC:一个可伸缩、低延迟的垃圾回收器。
ZGC 最先是在 JDK 11 中集成进来的,JDK 15 只是将 ZGC 垃圾收集器从预览特性变动为正式特性而已,没错,转正了。
这个 JEP 不会更改默认的 GC,默认仍然是 G1。
378:Text Blocks
文本块,是一个多行字符串,它能够避免使用大多数转义符号,自动以可预测的方式格式化字符串,并让开发人员在须要时能够控制格式。
文本块最先准备在 JDK 12 添加的,但最终撤消了,而后在 JDK 13 中做为预览特性进行了添加,而后又在 JDK 14 中再次预览,在 JDK 15 中,文本块终于转正,暂再也不作进一步的更改。
来看下这个示例你就懂了:
Java 13 以前:
String html = "<html>\n" +
" <body>\n" +
" <p>Hi, 啥啥啥</p>\n" +
" <p>欢迎关注,分享更多干货</p>\n" +
" </body>\n" +
"</html>\n";
Java 13+:
String html = """
<html>
<body>
<p>Hi,啥啥啥</p>
<p>欢迎关注,分享更多干货</p>
</body>
</html>
""";
去掉那些无用的换行和拼接,是否是太爽了。。
379:Shenandoah: A Low-Pause-Time Garbage Collector
Shenandoah:一个低停顿时间的垃圾回收器。
Shenandoah 最先是在 JDK 12 中集成进来的,JDK 15 只是将 Shenandoah 垃圾收集器从预览特性变动为正式特性而已,没错,又是转正了。
381:Remove the Solaris and SPARC Ports
移除了 Solaris 和 SPARC 端口。
移除了 Solaris/SPARC、Solaris/x64 和 Linux/SPARC 端口的源代码及构建支持。这些端口在 JDK 14 中就已经被标记为 deprecated 了,JDK 15 被移除也不奇怪。
383:Foreign-Memory Access API (Second Incubator)
外存访问 API(二次孵化),能够容许 Java 应用程序安全有效地访问 Java 堆以外的外部内存。
这个最先在 JDK 14 中成为孵化特性,JDK 15 继续二次孵化并对其 API 有了一些更新。
384:Records (Second Preview)
Records 最先在 JDK 14 中成为预览特性,JDK 15 继续二次预览。
Records 在某些场合能够干掉 Lombok 的存在,能自动生成了类构造器、toString()、hashCode()、equals(),以及相似 getter 的变量访问方法。
使用方式:
public record Student(String name, int id, int age) {}
实际生成:
看完是否是有点 Lombok 的感受?
385:Deprecate RMI Activation for Removal
废除 RMI 激活,以便在未来进行删除。
须要说明的是,RMI 激活是 RMI 中一个过期的组件,自 Java 8 以来一直是可选的。