就在昨天,JDK16 GA正式发布:
官方给出的JDK16所有特性一览如下,总计17个特性:
接下来,我们一一对其进行解读。
338: Vector API
Java提供了一些Vector API, 那到底什么是Vector API呢?废话不多说,给你举个例子。我们先写一段普通的Java代码:
- void scalarComputation(float[] a, float[] b, float[] c) {
- for (int i = 0; i < a.length; i++) {
- c[i] = (a[i] * a[i] + b[i] * b[i]) * -1.0f;
- }
- }
那么,用Vector API实现等价逻辑的代码如下所示。是不是更复杂了, CRY~图片,嗯,没关系,反正要用到Vector API起码得是10年以后的事情了:
- static final VectorSpecies<Float> SPECIES = FloatVector.SPECIES_256;
- void vectorComputation(float[] a, float[] b, float[] c) {
- for (int i = 0; i < a.length; i += SPECIES.length()) {
- var m = SPECIES.indexInRange(i, a.length);
- // FloatVector va, vb, vc;
- var va = FloatVector.fromArray(SPECIES, a, i, m);
- var vb = FloatVector.fromArray(SPECIES, b, i, m);
- var vc = va.mul(va).
- add(vb.mul(vb)).
- neg();
- vc.intoArray(c, i, m);
- }
- }
347: Enable C++14 Language Features
一句话概括就是JDK16的C++源码可以使用C++14的语法特性。并且如果在HotSpot源码中确实有用到的话,会给出这些特性的特殊指导说明。
369: Migrate to GitHub
OpenJDK终于也迁移到GitHub中,这个和 JEP 357: Migrate from Mercurial to Git 一起完成的。之前OpenJDK的源代码都是用Mercuial维护的,没听说过?没听说过就对了,也不用浪费时间去了解。
OpenJDK还解释了为什么选择GitHub,主要有3个原因:
最后,附上GitHub中OpenJDK项目地址:https://github.com/openjdk/。
376: ZGC: Concurrent Thread-Stack Processing
这个需求的意思是ZGC把线程栈处理从safepoint挪到并发阶段,从而减少GC的停顿时间。ZGC的目标就是消灭GC停顿和扩展性问题。为此,ZGC做了很多的工作,在把Thread-Stack从safepoint挪到并发阶段之前,还有很多其他的GC操作也做了这些优化,比如:marking, relocation, reference processing, class unloading, 以及大多数的 root processing。
386: Alpine Linux Port
支持一些新的平台,比如Alpine Linux。Alpine Linux是一个Linux发行版, 它是一个由社区开发的Linux操作系统,该操作系统以安全为理念,面向x86路由器、防火墙、虚拟专用网、IP电话盒及服务器而设计。官方用3个词来介绍它:Small. Simple. Secure。确实很小,它的发行包不到6MB。
此外,JEP 388: Windows/AArch64 Port 也是类似的特性,即支持Windows平台和ARM64(AArch64)平台。
392: Packaging Tool
这个特性在JDK14中已经被介绍过(JEP 343),它的目的是创建一个打包工具jpackage,jpackage将Java应用程序打包到特定平台的程序包中,该程序包包含所有必需的依赖项。该应用程序可以作为普通JAR文件的集合或作为模块的集合提供。受支持的特定平台的软件包格式有:Linux: deb and rpm macOS: pkg and dmg Windows: msi and exe
打包命令参考如下:
- $ jpackage --name myapp --input lib --main-jar main.jar
- # 如果MANIFEST.MF中没有Main-Class,也可以使用如下的打包命令
- $ jpackage --name myapp --input lib --main-jar main.jar \
- --main-class myapp.Main
393: Foreign-Memory Access API
引入API允许Java程序安全的、高效的访问堆外内存。这个需求的目标是希望做到如下几点:
JDK16将这些API放到孵化的名为jdk.incubator.foreign的模块中,有3个主要的抽象: MemorySegment, MemoryAddress 和 MemoryLayout。
394: Pattern Matching for instanceof
这个特性最先出现在JDK14中(JEP 305), JDK15中(JEP 375)是第二轮预览。此次加到JDK16中是彻底完成这个特性。这个特性是为了增强Java语法,允许在instanceof中加入表达式匹配。以前我们写代码可能需要这样:
- if (obj instanceof String) {
- String s = (String) obj; // grr...
- ...
- }
现在我们只需要这样:
- if (obj instanceof String s) {
- // Let pattern matching do the work!
- ...
- }
我们还可以这样:
- if (obj instanceof String s && s.length() > 5) {
- flag = s.contains("jdk");
- }
395: Records
很多人抱怨Java太冗余了,很多代码太形式主义了。比如如下这段代码所示,除了x和y的属性定义,其他的构造方法,equals、hashCode、toString方法基本上都借助IDE工具生成:
- 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发明了一种新的Java类,我们只需要简单的几行代码即可。有点类似于lombok给我们代码带来的简洁性:
- record Point(int x, int y) { }
397: Sealed Classes
中文翻译的含义是密封类,具体是什么意思呢?举个栗子,如下这段代码所示,Expr这个接口用sealed进行了修饰,那么只有permits后面的实现类实现这个接口,不允许其他实现类:
- package com.example.expression;
- public sealed interface Expr
- permits ConstantExpr, PlusExpr, TimesExpr, NegExpr { ... }
- public final class ConstantExpr implements Expr { ... }
- public final class PlusExpr implements Expr { ... }
- public final class TimesExpr implements Expr { ... }
- public final class NegExpr implements Expr { ... }
sealed不仅可以修饰interface,也可以修饰类class。JEP 397 的目的是限制接口的实现,以及限制类的继承。如此一来,类和接口的作者对其写的类和接口有更好的控制权。
sealed修饰的类有3大约束:
本文转载自微信公众号「阿飞的博客」,可以通过以下二维码关注。转载本文请联系阿飞的博客公众号。
XSS 攻击 xxs 攻击英文全称是 Croess SiteScripting ,意思就是跨站脚本攻击。是...
分布式应用运行时Dapr目前已经发布了1.1.0版本,阿里云也在积极地为Dapr贡献代码...
TOP云 (west.cn)3月2日消息,昨天早上sedo平台经纪人Frank Tillmanns在脸书上...
本文转载自微信公众号「五分钟学大数据」,作者园陌 。转载本文请联系五分钟学大...
转载自 https://github.com/maemual/raft-zh_cn/blob/master/raft-zh_cn.md 1 介...
Topic Topic是一类消息的集合,是一种逻辑上的分区。为什么说是逻辑分区呢?因为...
1.考历史的时候,我莫名的有一种沉重感,因为我就要改变历史了。 2.女人是书,...
本文转载自微信公众号「菜鸟飞呀飞」,作者刘进坤。转载本文请联系菜鸟飞呀飞公...
云服务器是否有图形界面? CentOS 6系列弹性云服务器如何安装图形化界面? CentO...
本文转载自微信公众号「HelloGitHub」,作者HelloGitHub。转载本文请联系HelloGi...