• Java SE 13 新增特性


    源码

    源仓库: Github:java_new_features
    镜像仓库: GitCode:java_new_features

    新版 Switch 使用方式

    switch 语句增加了 yield 关键字表示返回值,这个特性在 Java SE 13 中是预览特性,在 Java SE 14 正式引入。代码如下:

    注: 如果你用 Java SE 12 运行上述代码,需要指定 --enable-preview 参数.

    1. class="prettyprint hljs typescript" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">package git.snippets.jdk13;
    2. /**
    3. * switch yield功能
    4. * jdk13 实验性功能
    5. * 到jdk14 正式使用
    6. * @author @qq.com">Grey
    7. * @date 2021/11/29
    8. * @since 13
    9. */
    10. public class SwitchYield {
    11. public static void main(String[] args) {
    12. String t = test("apple");
    13. System.out.println(t);
    14. String m = test("abc");
    15. System.out.println(m);
    16. }
    17. private static String test(String c) {
    18. return switch (c) {
    19. case "apple", "Apple":
    20. yield "苹果";
    21. case "banana":
    22. yield "香蕉";
    23. default:
    24. yield "无法识别";
    25. };
    26. }
    27. }

    输出结果

    1. <pre class="hljs" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">苹果
    2. 无法识别

    文本块(预览功能)

    为了定义一个多行字符串,我们习惯于使用转义序列来处理字符串中包含的换行和双引号。例如,一个SQL语句看起来像这样

    1. <pre class="prettyprint hljs vbscript" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">String sql =
    2. "SELECT id, firstName, lastName FROM Employee\n"
    3. + "WHERE departmentId = \"IT\"\n"
    4. + "ORDER BY lastName, firstName";
    5. String content = "{\n"
    6. + " \"upperSummary\": null,\n"
    7. + " \"sensitiveTypeList\": null,\n"
    8. + " \"gmtModified\": \"2011-08-05 10:50:09\",\n"
    9. + " \"lowerGraph\": null,\n"
    10. + " \"signature\": \"\",\n"
    11. + " \"appName\": \"xxx\",\n"
    12. + " \"lowerSummary\": null,\n"
    13. + " \"gmtCreate\": \"2011-08-05 10:50:09\",\n"
    14. + " \"type\": \"CALL\",\n"
    15. + " \"name\": \"xxxx\",\n"
    16. + " \"subType\": \"yyy\",\n"
    17. + " \"id\": 1,\n"
    18. + " \"projectId\": 1,\n"
    19. + " \"status\": 1\n"
    20. + "}";

    JDK Enhancement Proposal 允许我们以更可读的方式编写这样的字符串。

    1. <pre class="prettyprint hljs sql" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">String sql = """
    2. SELECT id, firstName, lastName FROM Employee
    3. WHERE departmentId = "IT"
    4. ORDER BY lastName, firstName""";
    5. String content2 = """
    6. {
    7. "upperSummary": null,
    8. "sensitiveTypeList": null,
    9. "gmtModified": "2011-08-05 10:50:09",
    10. "lowerGraph": null,
    11. "signature": "",
    12. "appName": "xxx",
    13. "lowerSummary": null,
    14. "gmtCreate": "2011-08-05 10:50:09",
    15. "type": "CALL",
    16. "name": "xxxx",
    17. "subType": "yyy",
    18. "id": 1,
    19. "projectId": 1,
    20. "status": 1
    21. }
    22. """;

    文本块在 Java SE 13 属于预览功能,在 Java SE 15 中正式启用

    Socket API 新实现方式

    java.net.Socket 和 java.net.ServerSocket 类早在 Java 1.0 时就已经引入了,它们的实现的 Java 代码和 C 语言代码的混合,维护和调试都十分不易;而且这个实现还存在并发问题,有时候排查起来也很困难。

    因此,在 Java 13 中引入了新的实现方式,使用了新的实现 NioSocketImpl 来代替老旧的 PlainSocketImpl 实现。用户随时可以通过 -Djdk.net.usePlainSocketImpl 参数切换回老的实现方式,以兼容意外情况。代码如下

    1. "prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">package git.snippets.jdk13;
    2. import java.io.IOException;
    3. import java.net.ServerSocket;
    4. import java.net.Socket;
    5. /**
    6. * 新版Socket API 使用了新的实现 NioSocketImpl 来代替老旧的 PlainSocketImpl 实现。
    7. * 需要增加-XX:+TraceClassLoading参数
    8. *
    9. * @author Grey
    10. * @date 2022/8/20
    11. * @since 13
    12. */
    13. public class NewSocketAPI {
    14. public static void main(String[] args) {
    15. try (ServerSocket serverSocket = new ServerSocket(8000)) {
    16. boolean running = true;
    17. while (running) {
    18. Socket clientSocket = serverSocket.accept();
    19. //do something with clientSocket
    20. }
    21. } catch (IOException e) {
    22. e.printStackTrace();
    23. }
    24. }
    25. }

    使用 Java 13 运行,通过参数 -XX:+TraceClassLoading 追踪加载的类,日志中可以看到 NioSocketImpl。

    1. <pre class="prettyprint hljs markdown" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">[0.099s][info ][class,load] java.util.Properties$LineReader source: shared objects file
    2. [0.099s][info ][class,load] java.io.FileInputStream$1 source: shared objects file
    3. [0.100s][info ][class,load] sun.net.PlatformSocketImpl source: jrt:/java.base
    4. [0.100s][info ][class,load] sun.nio.ch.NioSocketImpl source: jrt:/java.base
    5. [0.100s][info ][class,load] sun.nio.ch.NativeDispatcher source: jrt:/java.base
    6. [0.100s][info ][class,load] sun.nio.ch.SocketDispatcher source: jrt:/java.base

    但在 Java 12 并不是 NioSocketImpl。

    1. <pre class="prettyprint hljs markdown" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">[0.120s][info ][class,load] java.util.concurrent.ConcurrentSkipListMap$Node source: shared objects file
    2. [0.120s][info ][class,load] java.net.SocketImpl source: jrt:/java.base
    3. [0.120s][info ][class,load] java.net.AbstractPlainSocketImpl source: jrt:/java.base
    4. [0.120s][info ][class,load] java.net.PlainSocketImpl source: jrt:/java.base
    5. [0.120s][info ][class,load] java.net.SocksSocketImpl source: jrt:/java.base

    ZGC: 取消提交未使用的内存

    ZGC 是 Java SE 11 中引入的一个实验性垃圾收集器,它承诺在10毫秒或更短的时间内实现 stop-the-world 。

    JDK Enhancement Proposal 扩展了 ZGC 的功能,以便在特定时间后将未使用的堆内存返回给操作系统。

    使用 -XX:ZUncommitDelay ,你可以指定ZGC返回未使用内存的时间,单位是秒。默认情况下,这个值是300秒。

    该功能默认是启用的,可以用 -XX:-ZUncommit 来禁用。

    ZGC 将在 Java SE 15 中达到生产状态。

    动态 CDS 档案

    Java SE 10 中引入了应用类数据共享--一个允许创建所谓共享存档文件的功能。这个文件包含了所使用平台的 JVM 所要求的二进制形式的应用类。该文件通过内存映射的 I/O 映射到 JVM 的内存中。

    直到现在,创建这个文件还相对复杂。首先,我们必须在应用程序的测试运行期间转储一个类列表。只有在第二步,我们才能从这个列表中生成共享档案。

    1. class="prettyprint hljs groovy" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">java -Xshare:off -XX:+UseAppCDS
    2. -XX:DumpLoadedClassList=helloworld.lst
    3. -cp target/helloworld.jar eu.happycoders.appcds.Main
    4. java -Xshare:dump -XX:+UseAppCDS
    5. -XX:SharedClassListFile=helloworld.lst
    6. -XX:SharedArchiveFile=helloworld.jsa
    7. -cp target/helloworld.jar

    JDK Enhancement Proposal 简化了这个过程。从 Java SE 13 开始,你可以指定 -XX:ArchiveClassesAtExit 参数,在应用程序执行结束时生成共享存档。不再需要额外的参数 -Xshare:on 和 -XX:+UseAppCDS 了。

    1. <pre class="prettyprint hljs nginx" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">java -XX:ArchiveClassesAtExit=helloworld.jsa
    2. -cp target/helloworld.jar eu.happycoders.appcds.Main

    创建的共享存档也比以前小得多。因为它现在只包含应用程序的类。

    从 Java SE 13 开始,共享存档的使用方法如下。

    1. <pre class="prettyprint hljs nginx" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">java -XX:SharedArchiveFile=helloworld.jsa
    2. -cp target/helloworld.jar eu.happycoders.appcds.Main<
  • 相关阅读:
    github-actions
    Unity --- 视频播放与角色控制器
    natapp内网穿透-将本地运行的程序/服务器通过公网IP供其它人访问
    前端技术点滴整理-1
    Python:Linux下安装Anaconda,可多人使用(内容几乎完整)
    C语言学习笔记 —— 内存管理
    【C++入门篇】保姆级教程篇【上】
    2023.11.17 关于 Spring Boot 日志文件
    数据库的下一个变革方向——云原生数据库
    DC电源模块关于宽电压输入和输出的范围
  • 原文地址:https://blog.csdn.net/Java_ttcd/article/details/126438643