乐趣区

关于java:Java13新特性及代码示例

你好啊,我是大阳。

Java 13 于 2019 年 9 月 17 日公布。在这篇文章中,咱们将介绍增加的一些个性以及一些代码示例。

Java13 的次要更新内容如下:

  • switch 表达式改良
  • 文本块改良
  • 动静 CDS 档案
  • ZGC:勾销提交未应用的内存
  • 从新实现 Legacy Socket API
  • 其余

1. switch 表达式改良

应用 yield,咱们当初能够无效地从 switch 表达式返回值,并可能更容易实现策略模式。

package cn.dayangshuo.collectors;

/**
 * @author DAYANG
 */
public class SwitchTest {public static void main(String[] args) {
        var me = 4;
        var operation = "平方";
        var result = switch (operation) {
            case "加倍" -> {yield me * 2;}
            case "平方" -> {yield me * me;}
            default -> me;
        };

        System.out.println(result);
    }
}

2. 文本块改良

第二个预览性能是多行 String 的 文本块,例如嵌入的 JSON、XML、HTML 等。

早些时候,为了在咱们的代码中嵌入 JSON,咱们将其申明为 字符串 文字:

String JSON_STRING 
  = "{\r\n" + "\"name\": \"Baeldung\",\r\n" + "\"website\": \"https://www.dayangshuo.cn/\"\r\n" + "}";

当初让咱们应用字符串 文本块编写雷同的 JSON:

String TEXT_BLOCK_JSON = """{"name":"Baeldung","website":"https://www.dayangshuo.cn/"}""";

很显著,不须要本义双引号或增加回车。通过应用文本块,嵌入的 JSON 更易于编写,更易于浏览和保护。

3. 动静 CDS 档案

一段时间以来,类数据共享 (CDS) 始终是 Java HotSpot VM 的一个突出个性。它容许 在不同的 JVM 之间共享类元数据,以缩小启动工夫和内存占用。JDK 10 通过增加应用程序 CDS (AppCDS) 扩大了这种能力——让开发人员可能在共享存档中蕴含应用程序类。JDK 12 进一步加强了这个个性,默认包含 CDS 归档。

然而,归档应用程序类的过程很繁琐。要生成存档文件,开发人员必须先试运行他们的应用程序以创立类列表,而后将其转储到存档中。之后,该存档可用于在 JVM 之间共享元数据。

通过动静归档,JDK 13 简化了这个过程。当初 咱们能够在应用程序退出时生成一个共享存档。这打消了试运行的须要。

要使应用程序可能在默认零碎存档之上创立动静共享存档,咱们须要增加一个选项 -XX:ArchiveClassesAtExit 并将存档名称指定为参数:

java -XX:ArchiveClassesAtExit=<archive filename> -cp <app jar> AppName

而后,咱们能够应用新创建的存档通过 -XX:SharedArchiveFile 选项运行雷同的应用程序:

java -XX:SharedArchiveFile=<archive filename> -cp <app jar> AppName

4. ZGC:勾销提交未应用的内存

Java 11 中引入了 ZGC 作为低提早垃圾收集机制,因而 GC 暂停工夫从未超过 10 毫秒。然而,与 G1 和 Shenandoah 等其余 HotSpot VM GC 不同,它没有装备将未应用的堆内存返回给操作系统的性能。

咱们当初缩小了内存占用并进步了性能。

从 Java 13 开始,ZGC 当初默认将未提交的内存返回给操作系统,直到达到指定的最小堆大小。如果咱们不想应用此性能,咱们能够通过以下形式回到 Java 11 形式:

  • 应用选项 -XX:-ZUncommit,
  • 设置相等的最小 (-Xms ) 和最大 (-Xmx ) 堆大小

此外,ZGC 当初反对的最大堆大小为 16TB。早些时候,限度到 4TB。

5. 从新实现 Legacy Socket API

自 Java 呈现以来,咱们曾经将 Socket(java.net.Socketjava.net.ServerSocket)API 视为 Java 不可或缺的一部分。然而,在过来的二十年里,它们从未现代化。它们是用遗留的 Java 和 C 编写的,既麻烦又难以保护。

Java 13 逆势而上,取代了底层实现,使 API 与将来的用户模式线程保持一致。提供者接口当初指向 NioSocketImpl 而不是 PlainSocketImpl。这个新编码的实现基于与java.nio 雷同的外部根底构造。

同样,咱们的确有方法回到应用 PlainSocketImpl。咱们能够通过将零碎属性-Djdk.net.usePlainSocketImpl 设置为 true 来启动 JVM,以应用较旧的实现。默认值为NioSocketImpl。

6. 其余

除了下面列出,Java 13 还为咱们带来了一些更显着的变动:

  • java.nio –增加了办法 *FileSystems.newFileSystem(Path, Map<String, ?>)
  • javax.crypto – 反对下一代 MS 密码术 (CNG)
  • javax.security – 增加属性 jdk.sasl.disabledMechanisms 以禁用 SASL 机制
  • javax.xml.crypto – 引入新的 字符串 常量来示意标准 XML 1.1 URI
  • javax.xml.parsers – 增加新办法以实例化具备命名空间反对的 DOM 和 SAX 工厂
  • Unicode 反对降级到版本 12.1
  • 增加了对 Kerberos 主体名称规范化和跨畛域援用的反对
退出移动版