所有栏目 | 云社区 美国云服务器[国内云主机商]
你的位置:首页 > 云社区 » 正文

Java14发布了,有什么新特性呢?你怎么看?

发布时间:2020-04-12 08:49:19

资讯分类:特性  发布  版本  新特性  就在
Java14发布了,有什么新特性呢?你怎么看?

1. 前言

前几天刚刚介绍了一个Java14很有用的预览特性 Java 14 新特性之 JEP 359: Records(Preview)。Java 14 就在 17 日发布了正式版本。大部分人还在用着 Java 8 , 真是尾气都吃不到了。不过好歹不是LTS版本,大家不要慌。

2. Java14 新特性

此版本包含的 JEP(Java/JDK Enhancement Proposals,JDK 增强提案)比 Java 12 和 Java13 加起来都多。总共 16 个新特性。我这里简要罗列一下:

305: instanceof 的模式匹配 (预览)

362: 弃用 Solaris 和 SPARC 端口

363: 移除 CMS(Concurrent Mark Sweep)垃圾收集器

366: 弃用 ParallelScavenge + SerialOld GC 组合

367: 移除 Pack200 Tools 和 API

370: 外部存储器 API (Incubator)

详细可以去官方文档查看。但是我个人认为有可用的新特性并不是很多,还是那句话大家不要慌。

3. 我们该如何选择 JDK 版本

其实还有很多同学不了解,自从JDK 修改了发布策略以后加快了迭代速度,每年的 3 月、9 月各会发布一个新的GA版本。大家都知道迁移成本很高。所以我们应该知道如何去选择JDK版本。这里我总结了几点:

处于商业成本和软件协议考虑,尽量使用 OpenJDK ,市面上有很多优秀的 OpenJDK,我们就在使用 AWS 的 Corretto。

尽量使用 LTS 版本,其实不光是 JDK 所有的软件都尽量使用长期支持版本。

尽量不要去盲目升级老项目的 JDK,除非你有充分的时间和精力去折腾。

4.总结

今天简单介绍了Java14的发布情况,也提供了一些升级JDK的建议,我个人认为没有必要升级,研究一下倒是可以的。不知道同学们有什么看法,可以留言讨论




Java14发布了,有什么新特性呢?你怎么看?

Java14发布,16大新特性,代码更加简洁明快

2020/3/17日JDK14正式发版,生产环境用不用再说,赶紧下载下来体验一番。不过据说该版本并不是长期版本,但即使再发布新版本也是在此基础上的。

另外,想体验Java14还是需要一些准备工作的,除了安装jdk,还需要安装支持java14的idea,比如2020.1版本。当然,如果整个团队都使用该版本,则需要同时升级IDE,否则低版本的IDE无法正确识别。

java14新特性

在JDK14中新增了以下16个新特性:

305: instanceof的模式匹配 (预览)

343: 打包工具 (Incubator)

345: G1的NUMA内存分配优化

349: JFR事件流

352: 非原子性的字节缓冲区映射

358: 友好的空指针异常

359: Records (预览)

361: Switch表达式 (标准)

362: 弃用Solaris和SPARC端口

363: 移除CMS(Concurrent Mark Sweep)垃圾收集器

364: macOS系统上的ZGC

365: Windows系统上的ZGC

366: 弃用ParallelScavenge + SerialOld GC组合

367: 移除Pack200 Tools和API

368: 文本块 (第二个预览版)

370: 外部存储器API (Incubator)

通过上述新特性,我们可以看出其中363、364、365、366都是关于垃圾回收器的。其中363已经明确弃用CMS垃圾收集器。

而其中针对开发过程中可见的特性包括:instanceof模式匹配、Switch表达式、文本块等。下面我们就来体验一下编程过程中能用到语法形式。

instanceof模式匹配

通常情况下我们使用instanceof来探测类的真实类型,如果符合该类型,则可进行强制转换。

在Java14之前,我们通常的写法如下:

Object obj = "程序新视界";

if(obj instanceof String){

String str = (String) obj;

System.out.println("关注公众号:" + str);

}

通过java14的新特性,我们可以简化成如下方式:

Object obj = "程序新视界";

if(obj instanceof String str){

System.out.println("关注公众号:" + str);

}

我们可以通过模式匹配简洁地表达对象,并允许各种语句和表达式对其进行测试。

Switch表达式

通常情况下我们通过如下形式使用switch语法:

switch (day) {

case MONDAY:

case FRIDAY:

case SUNDAY:

System.out.println(6);

break;

case TUESDAY:

System.out.println(7);

break;

case THURSDAY:

case SATURDAY:

System.out.println(8);

break;

case WEDNESDAY:

System.out.println(9);

break;

}

java14引入了新形式的switch标签“case L->”,表示如果匹配,则只执行标签右边的代码。switch标签允许在每种情况下使用逗号分隔多个常量。

switch (day) {

case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);

case TUESDAY -> System.out.println(7);

case THURSDAY, SATURDAY -> System.out.println(8);

case WEDNESDAY -> System.out.println(9);

}

是不是简单清晰了很多。

记录类型(Record Type)的引入

Java 14中记录类型(Record Type)作为预览特性被引入。记录对象允许使用紧凑的语法来声明类,和枚举类型一样,记录也是类的一种受限形式。

在idea 2020.1中,创建Record与创建类和枚举一样,可以在创建时直接选择对应的类型。

定义一个Record类型如下:

public record Point(int x, int y) {

}

使用Record操作如下:

Point point = new Point(1,3);

System.out.println(point.x());

System.out.println(point.y());

对Record类进行反编译我们会看到如下内容:

public final class Point extends java.lang.Record {

private final int x;

private final int y;

public Point(int x, int y) { /* compiled code */ }

public java.lang.String toString() { /* compiled code */ }

public final int hashCode() { /* compiled code */ }

public final boolean equals(java.lang.Object o) { /* compiled code */ }

public int x() { /* compiled code */ }

public int y() { /* compiled code */ }

}

是不是有替代Lombok的潜质?

文本块作为预览特性保留

通常情况下我们定义一个字符串,如果比较长可使用如下形式进行编写:

String html = "<html>n" +

" <body>n" +

" <p>Hello, world</p>n" +

" </body>n" +

"</html>n";

使用java14的文本块新特性,则可改写为如下形式:

String html = """

<html>

<body>

<p>Hello, world</p>

</body>

</html>

""";

文本块是Java语言的新语法,可以用来表示任何字符串,具有更高的表达能力和更少的复杂度。

文本块的开头定界符是由三个双引号字符(""")组成的序列,后面跟0个或多个空格,最后跟一个行终止符。内容从开头定界符的行终止符之后的第一个字符开始。

结束定界符是三个双引号字符的序列。内容在结束定界符的第一个双引号之前的最后一个字符处结束。

与字符串文字中的字符不同,文本块的内容中可以直接包含双引号字符。允许在文本块中使用",但不是必需的或不建议使用。

与字符串文字中的字符不同,内容可以直接包含行终止符。允许在文本块中使用n,但不是必需或不建议使用。

打包工具 (Incubator)

jpackage打包工具可以将Java应用程序打包为针对特定平台的安装包,这个安装包包含所有必需的依赖项。该应用程序可以以普通JAR文件集合或模块集合的方式提供。软件包格式可以分为:

Linux:deb和rpm

macOS:pkg和dmg

Windows:msi和exe

小结

当然,java14还有许多其他特性的优化,比如垃圾回收器的ParallelScavenge + SerialOld的弃用等。但在使用之前,还是需要慎重,毕竟很多特性都只是作为预览特性出现。

Java14发布了,有什么新特性呢?你怎么看?

OpenJDK 14 已于近日 GA,其在性能方面是否有改进、以及有哪些改进引起了不少开发者的关注。本文将会介绍通过运行新的基准测试以考察从 OpenJDK 8 至 14 的所有主要发行版本,同时考察跨多个工作负载的 JVM 性能,以及 OpenJDK 14 与 JVM 先前版本相比性能如何。

此次测试通过在被测试的每个发行版上使用相同的 Java 字节码编译的 Java 程序来查看 JVM 的性能,并使用被测软件包的参考/上游编译版本。为了保证测试受干扰的因素将降至最低,每次都使用相同的选项,除了交换用于测试每个发行版的 OpenJDK x86_64 Linux 构建之外,没有进行任何其他更改。

通过使用 Phoronix 的测试套件,测试内容包含从 SPECjbb 到 Java 2D 工作负载。

首先通过使用 Java 2D 基准测试对 Java 图形管道的性能进行压测,可以看到文本渲染性能一直稳步提升,直到第 12 版达到最高点,然后逐渐下降为目前 13 和 14 的水平,与 OpenJDK 8 比较相似。

而在 Java 2D 的图像渲染性能方面,它们的水平基本保持一致,但是 OpenJDK 14 以微弱的的性能优势成为了最好性能的那个。

这里还测试了使用矢量图形的渲染效果,水平基本保持一致。

通过进行非常基本的 Java SciMark 微基准测试,可以看到 OpenJDK 8 目前为止是最快的,并且自 OpenJDK 9 至 14 以来,性能基本上持平。OpenJDK 的运行速度约为 OpenJDK 8 的 88%。

通过使用 Java Bork 文件加密软件包进行测试,在经过测试的版本中,性能基本上没有变化。

自 OpenJDK 8 以来,DaCapo 的 H2 基准被建模为类似于 JDBCbench 的内存中(in-memory)基准,其性能得到了很好的提升,与此前的版本相比,OpenJDK 14 再次以微弱的优势获得了第一名。

可以看到,基于 Python Pybench 的 Jython 基准测试也是 OpenJDK 8 拥有最佳成绩的众多案例之一。

在运行 Daytrader 基准测试的 Tradebeans 测试中,OpenJDK 14 再度以微弱的优势拿下最佳的成绩。

就像打乒乓球一样,Renaissance 的 Scala Dotty 基准测试提供了一个类似的例子,说明 OpenJDK 的性能也会上下波动。在此次测试中,OpenJDK 14 又比最近的版本好一些。

在其他一些 Renaissance 基准测试中,OpenJDK 11〜12 的性能反而最差,而 OpenJDK 14 提供的性能与 OpenJDK 8 类似。

在使用 Jenetics+Futures 遗传算法的 Renaissance 基准测试中,所有版本的性能基本保持一致。

通过观察使用 Apache HBase 进行的这几个基准测试,可以发现 OpenJDK 8 运行最快,或者这几个 Java 版本的性能基本持平。

在使用 SPECjbb 进行的基准测试中 ,OpenJDK 8 是迄今为止最快且明显拉开距离的版本。自版本 11 起,OpenJDK 的 SPECjbb 性能有所提高,不过在运行 Ubuntu Linux 的 AMD Ryzen 9 3950X 系统上,任何版本的速度均未达到 OpenJDK 8 的速度。

当对所有执行的 Java 基准测试结果取几何平均值时,OpenJDK 8 毫无疑问是最快的 Java 版本。业界经常听到有关 OpenJDK 8 仍可提供最佳性能的消息,以及为什么英特尔的 Clear Linux 在有众多选择的情况下仍坚持该版本的原因。从本文的测试结果来看,这不足为奇。

好消息是,从这种几何意义上来看,OpenJDK 14 是经过测试的发行版中第二快的版本。与之前的版本相比,其领先优势虽然很小,但整体来看毕竟是在保持进步。

Java14发布了,有什么新特性呢?你怎么看?

我不看。

留言与评论(共有 0 条评论)
   
验证码:
Top