1. Java 12 新特性介紹

        共 6830字,需瀏覽 14分鐘

         ·

        2021-05-05 08:01

        Switch 表達式 (JEP 325)

        在 Java 12 中,對 Switch 表達式的寫法進行了改進,雖然是一個語法糖的改進,也讓 Switch 的代碼編寫變得更加優(yōu)雅。先看一下在 Java 12 之前的 Switch 的寫法。

        // 通過傳入月份,輸出月份所屬的季節(jié)
        public static void switchJava12Before(String day) {
            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;
            }
        }

        上面的例子中,通過傳入一個月份,輸出這個月份對應(yīng)的季節(jié)。簡單的功能卻寫了大量代碼,而且每個操作都需要一個 break來防止 Case 穿透

        使用預覽功能

        由于 Switch 表達式在 Java 12 中并不是一個正式發(fā)布的功能,還處于預覽測試階段,所以想要使用 Java 12 去編譯運行就需要打開功能預覽參數(shù),當然,如果你使用的是 Java 14 以及更高版本,就可以直接跳過這個部分了。

        # 編譯時
        ./bin/javac --enable-preview -source 12 ./Xxx.java
        # 運行時
        ./bin/java --enable-preview Xxx

        如果某個新特性是預覽功能,這意味著這個功能有可能在未來的版本中刪除。

        Java 12 Switch

        由于 Switch 存在的上述問題,所以在 Java 12 中對 Switch 進行了改進,讓其可以使用 case L -> 的方式進行操作,那么在 Java 12 中可以怎么編寫這段代碼呢?

        public static void switchJava12(String day) {
            switch (day) {
                case "march""april""may"            -> System.out.println("春天");
                case "june""july""august"           -> System.out.println("夏天");
                case "september""october""november" -> System.out.println("秋天");
                case "december""january""february"  -> System.out.println("冬天");
            }
        }

        通過測試可以得到預期的輸出結(jié)果。這還不夠,在 Switch 的改進中,還支持了使用 Switch 的返回值進行賦值。

        像下面這樣:

        String season = switch (day) {
            case "march""april""may"            -> "春天";
            case "june""july""august"           -> "春天";
            case "september""october""november" -> "春天";
            case "december""january""february"  -> "春天";
            default -> {
              //throw new RuntimeException("day error")
                System.out.println("day error");
                break "day error";
            }
        };
        System.out.println("當前季節(jié)是:" + season);

        雖然編寫更加簡單了,其實這些只不過是語法糖式的更新,編譯后和之前并沒有太大區(qū)別。

         

        文件對比 Files.mismatch

        在 Java 中對于文件的操作已經(jīng)在 Java 7 中進行了一次增強,這次 Java 12 又帶來了文件對比功能。對比兩個文件,如果內(nèi)容一致,會返回 -1 ,如果內(nèi)容不同,會返回不同的字節(jié)開始位置。

        // 創(chuàng)建兩個文件
        Path pathA = Files.createFile(Paths.get("a.txt"));
        Path pathB = Files.createFile(Paths.get("b.txt"));

        // 寫入相同內(nèi)容
        Files.write(pathA,"abc".getBytes(), StandardOpenOption.WRITE);
        Files.write(pathB,"abc".getBytes(), StandardOpenOption.WRITE);
        long mismatch = Files.mismatch(pathA, pathB);
        System.out.println(mismatch);

        // 追加不同內(nèi)容
        Files.write(pathA,"123".getBytes(), StandardOpenOption.APPEND);
        Files.write(pathB,"321".getBytes(), StandardOpenOption.APPEND);
        mismatch = Files.mismatch(pathA, pathB);
        System.out.println(mismatch);

        // 刪除創(chuàng)建的文件
        pathA.toFile().deleteOnExit();
        pathB.toFile().deleteOnExit();

        // RESULT
        // -1
        // 3

        對比功能的實現(xiàn)可以直接閱讀源碼,還是很簡單的。

         

        Compact Number

        簡化的數(shù)字格式可以直接轉(zhuǎn)換數(shù)字顯示格式,比如 1000 -> 1K,1000000 -> 1M 。

        System.out.println("Compact Formatting is:");
        NumberFormat upvotes = NumberFormat.getCompactNumberInstance(new Locale("en""US"), Style.SHORT);

        System.out.println(upvotes.format(100));
        System.out.println(upvotes.format(1000));
        System.out.println(upvotes.format(10000));
        System.out.println(upvotes.format(100000));
        System.out.println(upvotes.format(1000000));

        // 設(shè)置小數(shù)位數(shù)
        upvotes.setMaximumFractionDigits(1);
        System.out.println(upvotes.format(1234));
        System.out.println(upvotes.format(123456));
        System.out.println(upvotes.format(12345678));

        可以得到輸出如下:

        100
        1K
        10K
        100K
        1M
        1.2K
        123.5K
        12.3M

         

        JVM 相關(guān)更新

        Shenandoah 垃圾收集器

        Java 12 增加了 Shenandoah 一個低停頓的垃圾收集器,它可以和 Java 應(yīng)用程序中的執(zhí)行線程同時進行,用來收集垃圾進行內(nèi)容回收,這樣就可以讓停頓時間更少。

        更多關(guān)于 Shenandoah 垃圾收集器的介紹可以查看文檔:Shenandoah GC 介紹。

        ZGC 并發(fā)類卸載

        Z 垃圾收集器現(xiàn)在支持類卸載,通過卸載不使用的類來釋放這些類相關(guān)的數(shù)據(jù)結(jié)構(gòu),從而減少應(yīng)用程序的總體占用空間。因為是并發(fā)執(zhí)行,所以不會停止 Java 應(yīng)用程序線程的執(zhí)行,也因此對 GC 的暫停時間影響微乎其微。默認情況下啟用此功能,但可以使用命令行選項禁用-XX:-ClassUnloading。

        JVM 常量 API

        在包 java.lang.invoke.constant 中定義了一系列的基于值的符號引用,可以用來描述各種可加載常量??梢愿菀椎膶﹃P(guān)鍵類文件和運行時構(gòu)建的名義描述進行建模,特別是對那些從常量池中加載的常量,也讓開發(fā)者可以更簡單標準的處理可加載常量。

        默認使用類數(shù)據(jù)共享(CDS)

        這已經(jīng)不是 JDK 第一次改進 CDS(Class Data Sharing) 功能了,CDS 可以讓 JVM 在同一臺機器或虛擬機上啟動多個應(yīng)用的速度速度大大增加。原理是在啟動應(yīng)用時共享一些類加載信息,這樣啟動新進程時就可以使用共享的數(shù)據(jù)。在  Java 12 之前此功能需要手動開啟,Java 12 調(diào)整為默認開啟。

        微基準套件

        Java 12  中添加一套新的基于 JMH 的基本的微基準測試套件。 。

         

        其他更新

        1. 支持 Unicode 11

        在 Java 11 支持了 Unicode 10 之后, Java 12 支持了 Unicode 11,支持操作更多的表情、符號。

        文中示例已經(jīng)上傳到 github/niumoo/jdk-feature

        參考

        [1] http://openjdk.java.net/projects/jdk/12/

        [2] https://wiki.openjdk.java.net/display/shenandoah/Main

        [3] http://unicode.org/versions/Unicode11.0.0/


        有道無術(shù),術(shù)可成;有術(shù)無道,止于術(shù)

        歡迎大家關(guān)注Java之道公眾號


        好文章,我在看??

        瀏覽 47
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
          
          

            1. 欧美男人操女人 | 成人影院免费观看视频 | 黄色片视频日本 | www.麻豆视频 | 国产精品涩涩屋www在线观看 |