JDK13新特性詳解

xz43發表於2020-11-02

1、switch最佳化更新(預覽版)

 什麼是預覽版,也就是說當前版本有這個功能,下一個版本不確定會有,如果該功能效果不是很好,會被下一版本移除該功能。

JDK11以及之前的版本

switch (day) {
    case MONDAY: 
    case FRIDAY:
    case SUNDAY:
         System.out.println(6); 
         break; 
    case TUESDAY: 
        System.out.println(7); 
        break; case THURSDAY: 
    case SATURDAY: 
        System.out.println(8);
         break; 
    case WEDNESDAY:
         System.out.println(9);
         break; 
}

JDK12版本

switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6); 
    case TUESDAY -> System.out.println(7); 
    case THURSDAY, SATURDAY -> System.out.println(8); 
    case WEDNESDAY -> System.out.println(9);
 }

JDK13版本,可以返回資訊

@Testvoid test1() {   int k = 2;
   String result = switch (k) {      case  1 -> "one";      case  2 -> "two";      default -> "many";
   };
   System.out.println(result);
}

JDK13新特性詳解

2、文字塊升級

2.1、html例子

JDK13之前

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

JDK13最佳化

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

  2.2、SQL變化

JDK13之前

String query = "SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`\n" +
               "WHERE `CITY` = 'INDIANAPOLIS'\n" +
               "ORDER BY `EMP_ID`, `LAST_NAME`;\n";

JDK13

String query = """    
                SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`
                WHERE `CITY` = 'INDIANAPOLIS'                ORDER BY `EMP_ID`, `LAST_NAME`;
               """;

2.3、解釋

文字塊

"""
line 1
line 2
line 3
"""

相當於字串文字:

"line 1\nline 2\nline 3\n"

3、動態CDS檔案

    目標:

    提高應用程式類 - 資料共享(AppCDS)的可用性。消除了使用者進行試執行以建立每個應用程
序的類列表的需要。-Xshare:dump使用類列表由該選項啟用的靜態歸檔應繼續工作。這包括內建類
載入器和使用者定義的類載入器的類。

4、取消使用未使用的記憶體

       摘要:

  增強ZGC以將未使用的堆記憶體返回給作業系統。

      動機:

    ZGC目前沒有取消提交併將記憶體返回給作業系統,即使該記憶體長時間未使用。對於所有型別的應用
程式和環境,此行為並非最佳,尤其是那些需要關注記憶體佔用的應用程式和環境 例如:透過使用支付資
源的容器環境。應用程式可能長時間處於空閒狀態並與許多其他應用程式共享或競爭資源的環境。應用
程式在執行期間可能具有非常不同的堆空間要求。
    例如,啟動期間所需的堆可能大於穩態執行期間稍後所需的堆。HotSpot中的其他垃圾收集器,如
G1和Shenandoah,提供了這種功能,某些類別的使用者發現它非常有用。將此功能新增到ZGC將受到同一
組使用者的歡迎。

5、重新實現舊版套接字API    

      摘要:

    使用更簡單,更現代的實現替換java.net.Socket和java.net.ServerSocketAPI使用的底層實現,
易於維護和除錯。新的實現很容易適應使用者模式執行緒,也就是光纖,目前正在Project Loom中進行探索。

      動機:

    在java.net.Socket和java.net.ServerSocketAPI,以及它們的底層實現,可以追溯到JDK1.0。
實現是遺留Java和C程式碼的混合,維護和除錯很痛苦。該實現使用執行緒堆疊作為I/O緩衝區,這種方法需要多
次增加預設執行緒堆疊大小。該實現使用本機資料結構來支援非同步關閉,這是多年來微妙可靠性和移植問題的根
源。該實現還有幾個併發問題,需要進行大修才能正確解決。在未來的光纖世界環境中,而不是在本機方法中
阻塞執行緒,當前的實現不適用於目的。

6、 FileSystems.newFileSystem新方法

       核心庫/ java.nio中新增了FileSystems.newFileSystem(Path,Map <String,?>)方法 

       新增了三種新方法 java.nio.file.FileSystems,以便更輕鬆地使用將檔案內容視為檔案系統的檔案系統提供程式。

1、newFileSystem(Path)2、newFileSystem(Path, Map<String, ?>)3、newFileSystem(Path, Map<String, ?>, ClassLoader)    新增為newFileSystem(Path, Map<String, ?>) 已使用現有2-arg newFileSystem(Path,
ClassLoader)並指定類載入器的程式碼建立源(但不是二進位制)相容性問題。例如,由於引用
newFileSystem不明確,因此無法編譯以下內容:    FileSystem fs = FileSystems.newFileSystem(path, null),為了避免模糊引用,需要修改此程式碼以將第二個引數強制轉換為java.lang.ClassLoader。

7、nio新方法

      核心庫/ java.nio中新的java.nio.ByteBuffer批次獲取/放置方法轉移位元組而不考慮緩衝區位置。
    java.nio.ByteBufferjava.nio現在,其他緩衝區型別定義絕對批次get和put傳輸連續位元組序列的方法,而不考慮或影響緩衝區位置。

8、核心庫/ java.time

    新日本時代名稱Reiwa,此更新中新增了代表新Reiwa時代的例項。與其他時代不同,這個時代沒有公共
領域。它可以透過呼叫JapaneseEra.of(3)或獲得JapaneseEra.valueOf("Reiwa")。JDK13及更高版
本將有一個新的公共領域來代表這個時代。    NewEra從2019年5月1日開始的日本時代的佔位符名稱“ ”已被新的官方名稱取代。依賴佔位符名稱獲取
新時代單例(JapaneseEra.valueOf("NewEra"))的應用程式將不再起作用。

9、核心庫/ java.util中:I18N

      支援Unicode 12.1, 此版本將Unicode支援升級到12.1,其中包括以下內容:

    java.lang.Character支援12.1級的Unicode字元資料庫,其中12.0從11.0開始增加554個字元,
總共137,928個字元。這些新增內容包括4個新指令碼,總共150個指令碼,以及61個新的表情符號字元。U+32FF SQUARE ERA NAME REIWA從12.0開始,12.1只新增一個字元。java.text.Bidi和java.text.Normalizer類分別支援12.0級的Unicode標準附件,#9和#15。java.util.regexpackage支援基於12.0級Unicode標準附件#29的擴充套件字形叢集。

10、熱點/ GC

    10.1 JEP 351 ZGC取消提交未使用的儲存器     10.2 新增了-XXSoftMaxHeapSize標誌
    10.3 ZGC支援的最大堆大小從4TB增加到16TB

11、安全庫/ java.security

    11.1 該com.sun.security.crl.readtimeout系統屬性設定為CRL檢索的最大讀取超時,單位為秒。
如果尚未設定該屬性,或者其值為負,則將其設定為預設值15秒。值0表示無限超時。
    11.2 新的keytool -showinfo -tls用於顯示TLS配置資訊的命令keytool -showinfo -tls新增
了一個顯示TLS配置資訊的新命令。    11.3 SunMSCAPI提供程式現在支援以下一代加密(CNG)格式讀取私鑰。這意味著CNG格式的RSA和EC金鑰可從Windows金鑰庫載入,例如“Windows-MY”。與EC(簽名演算法SHA1withECDSA,SHA256withECDSA等等)也支援。

12、刪除功能

       刪除的部分功能:

    12.1 核心庫/java.net中,不再支援Pre-JDK 1.4 SocketImpl實現java.net.SocketImpl此版本已刪除對為JavaSE1.3及更早版本編譯的自定義實現的支援。此更改對SocketImpl為Java SE 1.4(2002年釋出)或更新版本編譯的實現沒有影響。    12.2 核心庫/java.lang中,刪除執行時跟蹤方法,過時的方法traceInstructions(boolean),並traceMethodCalls(boolean)已經從刪除java.lang.Runtime類。這些方法對許多版本都不起作用,它們的預期功能由Java虛擬機器工具介面(JVMTI)提供。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9399028/viewspace-2731739/,如需轉載,請註明出處,否則將追究法律責任。

相關文章