Java 12 的新功能

javaobject oriented programmingprogramming更新于 2024/8/17 11:36:00

Java 12 新功能简介

2019 年 3 月 19 日,Java 12 正式发布。Java 12 版本中包含的几项新功能和增强功能使其在几乎所有方面都比 Java 11 有了值得升级的地方。Switch 表达式、默认 CDS 存档、Shenandoah 和 Microbenchmark Suite 是 Java 12 中值得特别提及的一些功能。

为了提高 Java 的生产力、可用性和程序员的多功能性,添加了这些功能。我们将在本文中深入讨论这些新功能。

Switch 表达式 (JEP 325)

值得指出的是,Java 12 在 switch 表达式方面进行了值得注意的增强。它们现在可以用作语句和表达式,从而简化代码并允许使用 switch 进行模式匹配。

过去,不包括 break 语句可能会导致默认失败,这是 Java 代码中常见的错误原因。然而,随着 Java 12 的最新更新,switch 表达式中的默认情况现在是强制性的,从而防止出现此类问题。switch 表达式功能的这些修改提高了 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 并在没有 CDS 的情况下运行程序,我们需要手动将 Xshare 标志设置为"off"。

G1 的可中止混合收集 (JEP 344)

默认设置的 Garbage First (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 拥有增强开发人员编程能力的新功能。借助 Switch 表达式、Stream API 中的 collects.teeing() 和 Shenandoah,Java 现在更加高效和可靠。JVM Constant API、默认 CDS 存档、G1 的可中止混合集合和 Microbenchmark 套件使 Java 更加高效和通用。这些升级简化了代码并提高了应用程序的稳健性。


相关文章