Java 12 新特性
Java 12 新特性的介绍
2019年3月19日,Java 12 正式发布。Java 12 版本中包含的若干新特性和增强功能几乎在各个方面都使其成为对 Java 11 的重大升级。开关表达式、默认 CDS 归档、Shenandoah 和微基准测试套件是 Java 12 中值得特别提及的几个特性。
这些特性旨在提高 Java 的生产力、可用性和对开发人员的多功能性。在本文中,我们将深入探讨这些新功能。
开关表达式 (JEP 325)
值得注意的是,Java 12 对开关表达式进行了显著改进。它们现在既可以用作语句,也可以用作表达式,从而简化了代码,并允许在 switch 中进行模式匹配。
过去,不包含 break 语句可能会导致默认贯穿执行,这是 Java 代码中常见错误的一个主要原因。然而,在 Java 12 的最新更新中,开关表达式中的默认情况现在是强制性的,从而避免了此类问题。开关表达式特性的这些修改提高了 Java 12 作为开发人员编程语言的效率和可靠性。
让我们通过示例代码来了解传统的 switch 语句 (Java 11) 与 Java 12 的区别。
Stream API 中的 Collectors.teeing()
作为一种静态方法,teeing 收集器已可用。Collectors::teeing。此收集器将其输入发送到另外两个收集器,然后这两个收集器使用一个函数组合其输出。
可以向 teeing(Collector, Collector, BiFunction) 提供两个收集器,以及一个用于组合数据的函数。两个下游收集器分别处理传递给结果收集器的每个元素,并且使用所述合并函数将它们的处理输出与最终收集器的输出组合。
算法
步骤 1 - 首先,我们需要创建一个 8 到 14 之间的整数流。
步骤 2 - 接下来,我们可以使用 Java 12 中新添加的 Collectors.teeing() 函数构建的收集器来确定流中整数的平均值。
步骤 3 - Collectors.teeing() 方法使用两个收集器和一个函数来合并它们的输出以计算平均值。
步骤 4 - 最后,将计算出的平均值打印到控制台以显示。
示例 1
此程序演示如何使用 Collectors.teeing() 方法计算整数流的平均值。
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class APITester {
public static void main(String[] args) {
double mean
= Stream.of(8, 9, 10, 11, 12, 13, 14)
.collect(Collectors.teeing(
Collectors.summingDouble(i -> i), Collectors.counting(),
(sum, n) -> sum / n));
System.out.println(mean);
}
}
输出
11.0
Shenandoah
你听说过 Shenandoah 吗?这是一个新的改进的垃圾收集器,尽管它仍处于实验阶段。此 GC 算法通过与正在运行的 Java 线程同时执行疏散工作来提供低暂停时间。这意味着暂停时间不依赖于堆大小。无论是小的 5MB 堆还是巨大的 10GB 堆,暂停时间都将相同。
JVM 常量 API
如果你正在使用操作类和方法的程序,JVM 常量 API 可能是你的宝贵工具。在这些类型的程序中,需要建模字节码指令并处理可加载的常量。虽然 String 或 Integer 类型的常量通常不会出现问题,但 Class 类型的常量可能会更具挑战性。如果类不可访问或不存在,则加载类可能会失败。
好消息是,新的 API 通过使用 ClassDesc、MethodTypeDesc、MethodHandleDesc 和 DynamicConstantDesc 等接口来象征性地处理常量值,简化了问题。这种方法消除了处理类常量时涉及的许多复杂性,从而更容易在程序中操作和管理它们。
默认 CDS 归档
类数据共享 (CDS) 是一项重要功能,它可以减少多个 Java 虚拟机上的启动时间和内存占用。它通过利用构建时生成的默认类列表来实现此目的,该列表包含必要的核心库类。
在 Java 12 中,此功能有所改变 - CDS 归档现在默认启用。要禁用 CDS 并运行没有它的程序,我们需要手动将 Xshare 标志设置为“off”。
针对 G1 的可中止混合收集 (JEP 344)
设置为默认的垃圾优先 (G1) 垃圾收集器拥有一个令人印象深刻的分析引擎,用于确定收集集。一旦启动该过程,它旨在不间断地收集所有活动对象。但是,当目标暂停时间超过时,此方法有时会导致性能问题。
为了解决这个问题,G1 收集集现在被分成可选部分和强制部分,允许该过程可中止。优先处理强制集通常可以确保达到目标暂停时间,防止收集过程超过其限制。此技术对于使 G1 垃圾收集器高效运行至关重要,不会造成任何重大的性能问题。
微基准测试套件 (JEP 230)
此最新补充对于开发人员来说是一个改变游戏规则的功能,他们现在可以轻松地创建和执行微基准测试。微基准测试是用于衡量单个代码片段或方法的有效性的关键工具。它们有助于查明性能障碍并增强代码以最大限度地提高效率。
使用新推出的微基准测试套件,开发人员现在可以毫不费力地运行预先存在的微基准测试或创建新的微基准测试。该套件已智能地集成到 JDK 源代码中,这意味着开发人员可以无缝地对其代码进行基准测试。
默认类数据共享归档 (JEP 341)
Java 12 中改进了 CDS(默认类数据共享)归档创建过程。64 位平台上的 JDK 构建过程使用默认类列表来实现此目的。因此,创建 CDS 归档的过程得到了改进和简化。
从 G1 快速返回未使用的已提交内存 (JEP 346)
由于 JEP 346,Java 12 中的 G1 垃圾收集器现在可以快速将未充分利用的已提交内存返回给操作系统。在 Java 11 中,G1 垃圾收集在空闲时无法将 Java 堆内存返回给操作系统,因此这是一个升级。由于 G1 垃圾收集器,Java 12 提供了增强的内存管理能力,从而更有效地利用系统资源。
Files.mismatch() 方法
介绍“Files.mismatch()”,这是一种新技术,可以启用文件比较。此实用函数的签名是“public static long mismatch(Path path1, Path path2) throws IOException”,如果没有任何不匹配,则返回 -1L。如果存在不匹配,则会提供第一个不匹配的位置。
两种不同的情况可能导致不匹配:
首先,如果文件大小不同,则该方法将返回较小的文件大小。
此外,如果文件的字节不匹配,它将报告第一个不同字节的位置。
结论
Java 12 拥有增强开发人员编程的新特性。通过开关表达式、Stream API 中的 collectors.teeing() 和 Shenandoah,Java 现在更高效、更可靠。JVM 常量 API、默认 CDS 归档、针对 G1 的可中止混合收集和微基准测试套件使 Java 更加高效和多功能。这些升级简化了代码并提高了应用程序的鲁棒性。
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP