您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java12有什么新特性”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java12有什么新特性”吧!
在 Java 12 中,對(duì) Switch 表達(dá)式的寫法進(jìn)行了改進(jìn),雖然是一個(gè)語法糖的改進(jìn),也讓 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; } }
上面的例子中,通過傳入一個(gè)月份,輸出這個(gè)月份對(duì)應(yīng)的季節(jié)。簡單的功能卻寫了大量代碼,而且每個(gè)操作都需要一個(gè) break來防止 Case 穿透。
使用預(yù)覽功能
由于 Switch 表達(dá)式在 Java 12 中并不是一個(gè)正式發(fā)布的功能,還處于預(yù)覽測(cè)試階段,所以想要使用 Java 12 去編譯運(yùn)行就需要打開功能預(yù)覽參數(shù),當(dāng)然,如果你使用的是 Java 14 以及更高版本,就可以直接跳過這個(gè)部分了。
# 編譯時(shí) ./bin/javac --enable-preview -source 12 ./Xxx.java # 運(yùn)行時(shí) ./bin/java --enable-preview Xxx
如果某個(gè)新特性是預(yù)覽功能,這意味著這個(gè)功能有可能在未來的版本中刪除。
Java 12 Switch
由于 Switch 存在的上述問題,所以在 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("冬天"); } }
通過測(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);
雖然編寫更加簡單了,其實(shí)這些只不過是語法糖式的更新,編譯后和之前并沒有太大區(qū)別。
在 Java 中對(duì)于文件的操作已經(jīng)在 Java 7 中進(jìn)行了一次增強(qiáng),這次 Java 12 又帶來了文件對(duì)比功能。對(duì)比兩個(gè)文件,如果內(nèi)容一致,會(huì)返回 -1 ,如果內(nèi)容不同,會(huì)返回不同的字節(jié)開始位置。
// 創(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)可以直接閱讀源碼,還是很簡單的。
簡化的數(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
Shenandoah 垃圾收集器
Java 12 增加了 Shenandoah 一個(gè)低停頓的垃圾收集器,它可以和 Java 應(yīng)用程序中的執(zhí)行線程同時(shí)進(jìn)行,用來收集垃圾進(jìn)行內(nèi)容回收,這樣就可以讓停頓時(shí)間更少。
更多關(guān)于 Shenandoah 垃圾收集器的介紹可以查看文檔:Shenandoah GC 介紹。
ZGC 并發(fā)類卸載
Z 垃圾收集器現(xiàn)在支持類卸載,通過卸載不使用的類來釋放這些類相關(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)引用,可以用來描述各種可加載常量??梢愿菀椎膶?duì)關(guān)鍵類文件和運(yùn)行時(shí)構(gòu)建的名義描述進(jìn)行建模,特別是對(duì)那些從常量池中加載的常量,也讓開發(fā)者可以更簡單標(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)開啟,Java 12 調(diào)整為默認(rèn)開啟。
微基準(zhǔn)套件
Java 12 中添加一套新的基于 JMH 的基本的微基準(zhǔn)測(cè)試套件。 。
1. 支持 Unicode 11
在 Java 11 支持了 Unicode 10 之后, Java 12 支持了 Unicode 11,支持操作更多的表情、符號(hào)。
感謝各位的閱讀,以上就是“Java12有什么新特性”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Java12有什么新特性這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。