从Java 8到 Java 17–Java 13

/ 0评 / 0

Java 13 它不是一个长久支持(LTS)版本。

重点特性列表

动态应用程序类-数据共享

JDK5引入了Class-Data Sharing可以用于多个JVM共享class,提升启动速度,最早只支持system classes及serial GC

JDK9对其进行扩展以支持application classes及其他GC算法

java10的新特性JEP 310: Application Class-Data Sharing扩展了JDK5引入的Class-Data Sharing,支持application的Class-Data Sharing并开源出来(以前是commercial feature)

JDK11将-Xshare:off改为默认-Xshare:auto,以更加方便使用CDS特性

JDK12的341: Default CDS Archives即在64-bit平台上编译jdk的时候就默认在${JAVA_HOME}/lib/server目录下生成一份名为classes.jsa的默认archive文件(大概有18M)方便大家使用

JDK13的这个特性支持在Java application执行之后进行动态archive

导出jsa:

java -XX:ArchiveClassesAtExit=hello.jsa -cp hello.jar Hello

使用jsa:

java -XX:SharedArchiveFile=hello.jsa -cp hello.jar Hello

增强 ZGC 释放未使用内存

暂时无..

Switch 表达式扩展(预览功能)

在 Java 12 中引入了 Switch 表达式作为预览特性,而在 Java 13 中对 Switch 表达式做了增强改进,在块中引入了 yield 语句来返回值,而不是使用 break。这意味着,Switch 表达式(返回值)应该使用 yield,而 Switch 语句(不返回值)应该使用 break,而在此之前,想要在 Switch 中返回内容,还是比较麻烦的,只不过目前还处于预览状态。

在 Java 13 之后,Switch 表达式中就多了一个关键字用于跳出 Switch 块的关键字 yield,主要用于返回一个值,它和 return 的区别在于:return 会直接跳出当前循环或者方法,而 yield 只会跳出当前 Switch 块,同时在使用 yield 时,需要有 default 条件。

在 Java 12 之前,传统 Switch 语句写法为:

        String day = "march";
        switch (day) {
            case "march":
            case "april":
            case "may":
                System.out.println("春天");
                break;
            case "june":
            case "july":
            case "august":
                System.out.println("夏天");
                break;
            case "september":
            case "october":
            case "november":
                System.out.println("秋天");
                break;
            case "december":
            case "january":
            case "february":
                System.out.println("冬天");
                break;
        }

在 Java 12 之后,关于 Switch 表达式的写法改进为如下:

        String day = "march";
        String data = switch (day) {
            case "march", "april", "may" -> "春天";
            case "june", "july", "august" -> "夏天";
            case "september", "october", "november" -> "秋天";
            case "december", "january", "february" -> "冬天";
            default -> "dayError";
        };
        System.out.println("当前季节是:" + data);

而在 Java 13 中,value break 语句不再被编译,而是用 yield 来进行值返回,上述写法被改为如下写法:

        String day = "march";
        String data = switch (day) {
            case "march", "april", "may":
                yield "春天";
            case "june", "july", "august":
                yield "夏天";
            case "september", "october", "november":
                yield "秋天";
            case "december", "january", "february":
                yield "冬天";
            default:
                yield "unknown";
        };
        System.out.println("当前季节是:" + data);

文本块(预览功能)

在 Java 13 之前,多行字符串写法为:

String html ="<html>\n" +
              "   <body>\n" +
              "      <p>Hello, World</p>\n" +
              "   </body>\n" +
              "</html>\n";


 String json ="{\n" +
              "   \"name\":\"glj\",\n" +
              "   \"age\":25\n" +
              "}\n";

在 Java 13 引入文本块之后,写法为:

        String html = """
                <html>
                    <body>
                        <p>Hello, World</p>
                    </body>
                </html>
                """;

        String json = """
                {
                    "name":"glj",
                    "age":25
                }
                """;

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注