<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Java 12 新特性介紹

          共 6830字,需瀏覽 14分鐘

           ·

          2021-05-05 08:01

          Switch 表達(dá)式 (JEP 325)

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

          // 通過(guò)傳入月份,輸出月份所屬的季節(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;
              }
          }

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

          使用預(yù)覽功能

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

          # 編譯時(shí)
          ./bin/javac --enable-preview -source 12 ./Xxx.java
          # 運(yùn)行時(shí)
          ./bin/java --enable-preview Xxx

          如果某個(gè)新特性是預(yù)覽功能,這意味著這個(gè)功能有可能在未來(lái)的版本中刪除

          Java 12 Switch

          由于 Switch 存在的上述問(wèn)題,所以在 Java 12 中對(duì) Switch 進(jìn)行了改進(jìn),讓其可以使用 case L -> 的方式進(jìn)行操作,那么在 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("冬天");
              }
          }

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

          像下面這樣:

          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("當(dāng)前季節(jié)是:" + season);

          雖然編寫更加簡(jiǎn)單了,其實(shí)這些只不過(guò)是語(yǔ)法糖式的更新,編譯后和之前并沒(méi)有太大區(qū)別。

           

          文件對(duì)比 Files.mismatch

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

          // 創(chuàng)建兩個(gè)文件
          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

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

           

          Compact Number

          簡(jiǎn)化的數(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 一個(gè)低停頓的垃圾收集器,它可以和 Java 應(yīng)用程序中的執(zhí)行線程同時(shí)進(jìn)行,用來(lái)收集垃圾進(jìn)行內(nèi)容回收,這樣就可以讓停頓時(shí)間更少。

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

          ZGC 并發(fā)類卸載

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

          JVM 常量 API

          在包 java.lang.invoke.constant 中定義了一系列的基于值的符號(hào)引用,可以用來(lái)描述各種可加載常量。可以更容易的對(duì)關(guān)鍵類文件和運(yùn)行時(shí)構(gòu)建的名義描述進(jìn)行建模,特別是對(duì)那些從常量池中加載的常量,也讓開(kāi)發(fā)者可以更簡(jiǎn)單標(biāo)準(zhǔn)的處理可加載常量。

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

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

          微基準(zhǔn)套件

          Java 12  中添加一套新的基于 JMH 的基本的微基準(zhǔn)測(cè)試套件。 。

           

          其他更新

          1. 支持 Unicode 11

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

          文中示例已經(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/


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

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


          好文章,我在看??

          瀏覽 47
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧洲成人免费视频 | а天堂中文在线官网 | 天天干天天操天天干天天操 | 无码一区二区激情 | 日逼视频网站免费观看 |