收藏版:《JDK13新特性詳解》

Java大蝸牛發表於2019-09-21

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版本

static void howMany(int k) {
    System.out.println(        switch (k) {            case  1 -> "one"
            case  2 -> "two"
            default -> "many"
        }
    );}

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,以及它們的底層實現,可以追溯到JDK 1.0。實現是遺留Java和C代
碼的混合,維護和除錯很痛苦。該實現使用執行緒堆疊作為I/O緩衝區,這種方法需要多次增加預設執行緒堆疊大小。該實現使用本機資料
結構來支援非同步關閉,這是多年來微妙可靠性和移植問題的根源。該實現還有幾個併發問題,需要進行大修才能正確解決。在未來的光
纖世界環境中,而不是在本機方法中阻塞執行緒,當前的實現不適用於目的。加q群:478052716 免費領取(Java架構資料,影片資料,BATJ面試資料)

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)並指定類載入器
的程式碼建立源(但不是二進位制)相容性問題。null.例如,由於引用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日開始的日本時代的佔位符名稱“ ”已被新的官方名稱取代。依賴佔位符名稱(請參閱JDK-8202088)獲
取新時代單例(JapaneseEra.valueOf("NewEra"))的應用程式將不再起作用。請參閱JDK-8205432

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/31545684/viewspace-2657828/,如需轉載,請註明出處,否則將追究法律責任。

相關文章