Java/JDK各版本主要特性彙總

2022-12-09 06:04:01

Java18(2022.3)

  1. 將 UTF-8 指定為標準 Java API 的預設字元集
  2. 提供支援靜態檔案的最小 Web 伺服器命令列工具jwebserver
  3. 定義了一個全新的 SPI(service-provider interface),用於主要名稱和地址的解析
  4. 棄用 Finalization

Java17(2021.9)(LTS版本)

  1. Free Java License
  2. JDK 17 將取代 JDK 11 成為下一個長期支援版本
  3. Spring 6 和 Spring Boot 3需要JDK17
  4. 移除實驗性的 AOT 和 JIT 編譯器
  5. 恢復始終執行嚴格模式 (Always-Strict) 的浮點定義
  6. 正式引入密封類sealed class,限制抽象類的實現
  7. 統一紀錄檔非同步重新整理,先將紀錄檔寫入快取,然後再非同步重新整理

雖然JDK17也是一個LTS版本,但是並沒有像JDK8和JDK11一樣引入比較突出的特性,主要是對前幾個版本的整合和完善。

Java16(2021.3)

  1. 允許在 JDK C ++原始碼中使用 C ++ 14功能
  2. ZGC效能優化,去掉ZGC執行緒堆疊處理從安全點到並行階段
  3. 增加 Unix 域通訊端通道
  4. 彈性元空間能力
  5. 提供用於打包獨立 Java 應用程式的 jpackage 工具

JDK16相當於是將JDK14、JDK15的一些特性進行了正式引入,如instanceof模式匹配(Pattern matching)、record的引入等最終到JDK16變成了final版本。

Java15(2020.9)

  1. EdDSA 數位簽章演演算法
  2. Sealed Classes(封閉類,預覽),通過sealed關鍵字修飾抽象類限定只允許指定的子類才可以實現或繼承抽象類,避免抽象類被濫用。
  3. Hidden Classes(隱藏類)
  4. 移除 Nashorn JavaScript引擎
  5. 改進java.net.DatagramSocket 和 java.net.MulticastSocket底層實現

Java14(2020.3)

  1. instanceof模式匹配,instanceof型別匹配語法簡化,可以直接給物件賦值,如if(obj instanceof String str),如果obj是字串型別則直接賦值給了str變數
  2. 引入Record型別,類似於Lombok 的@Data註解,可以向Lombok一樣自動生成構造器、equals、getter等方法;
  3. Switch 表示式-標準化
  4. 改進 NullPointerExceptions提示資訊,列印具體哪個方法拋的空指標異常,避免同一行程式碼多個函數呼叫時無法判斷具體是哪個函數拋異常的困擾,方便異常排查;
  5. 刪除 CMS 垃圾回收器

Java13(2019.9)

  1. Switch 表示式擴充套件(引入 yield 關鍵字);switch表示式增加yield關鍵字用於返回結果,作用類似於return,如果沒有返回結果則使用break。
  2. 文字塊升級 """;引入了文字塊,可以使用"""三個雙引號表示文字塊,文字塊內部就不需要使用換行的跳脫字元。
  3. SocketAPI 重構;(Socket的底層實現優化,引入了NIO)
  4. FileSystems.newFileSystem新方法
  5. 增強 ZGC 釋放未使用記憶體;(ZGC優化,將標記長時間空閒的堆記憶體空間返還給作業系統,保證堆大小不會小於設定的最小堆記憶體大小,如果堆最大和最小記憶體大小設定一樣,則不會釋放記憶體還給作業系統。)

重要特性:ZGC優化,釋放記憶體還給作業系統、socket底層實現引入NIO。

Java12(2019.3)

  1. Switch 表示式擴充套件,可以有返回值
  2. 新增NumberFormat對複雜數位的格式化
  3. 字串支援transform、indent操作
  4. 新增方法Files.mismatch(Path, Path)
  5. Teeing Collector
  6. 支援unicode 11
  7. Shenandoah GC,新增的GC演演算法
  8. G1收集器的優化,將GC的垃圾分為強制部分和可選部分,強制部分會被回收,可選部分可能不會被回收,提高GC的效率

重要特性:switch表示式語法擴充套件、G1收集器優化、新增Shenandoah GC垃圾回收演演算法。

Java11(2018.9)(LTS版本)

  1. 增加一些符串處理方法
  2. 用於 Lambda 引數的區域性變數語法
  3. Http Client重寫,支援HTTP/1.1和HTTP/2 ,也支援 websockets
  4. 可執行單一Java原始碼檔案,如:java Test.java
  5. ZGC:可伸縮低延遲垃圾收集器,(ZGC可以看做是G1之上更細粒度的記憶體管理策略。由於記憶體的不斷分配回收會產生大量的記憶體碎片空間,因此需要整理策略防止記憶體空間碎片化,在整理期間需要將對於記憶體參照的執行緒邏輯暫停,這個過程被稱為"Stop the world"。只有當整理完成後,執行緒邏輯才可以繼續執行。(並行回收))
  6. 支援 TLS 1.3 協定
  7. Flight Recorder(飛行記錄器),基於OS、JVM和JDK的事件產生的資料收集框架
  8. 對Stream、Optional、集合API進行增強

重要特性:對於JDK9和JDK10的完善,主要是對於Stream、集合等API的增強、新增ZGC垃圾收集器。

Java10(2018.3)

  1. 區域性變數型別推斷,(類似JS可以通過var來修飾區域性變數,編譯之後會推斷出值的真實型別)
  2. 不可變集合的改進
  3. 並行全垃圾回收器 G1,來優化G1的延遲
  4. 執行緒本地握手,(允許在不執行全域性VM安全點的情況下執行執行緒回撥,可以停止單個執行緒,而不需要停止所有執行緒或不停止執行緒)
  5. Optional新增orElseThrow()方法
  6. 類資料共用
  7. Unicode 語言標籤擴充套件
  8. 根證書

重要特性:通過var關鍵字實現區域性變數型別推斷,使Java語言變成弱型別語言、JVM的G1垃圾回收由單執行緒改成多執行緒並行處理,降低G1的停頓時間。

Java9(2017.9)

  1. 模組化
  2. 提供了List.of()、Set.of()、Map.of() 和 Map.ofEntries() 等工廠方法
  3. 介面支援私有方法
  4. Optional 類改進
  5. 多版本相容Jar包
  6. JShell工具
  7. try-with-resources的改進
  8. Stream API的改進
  9. 設定G1為JVM預設垃圾收集器
  10. 支援http2.0和websocket的API

重要特性:主要是API的優化,如支援HTTP2的Client API、JVM採用G1為預設垃圾收集器。

Java8(2014.3)(LTS版本)

  1. lambada表示式
  2. 函數式介面
  3. 方法參照
  4. 預設方法
  5. Stream API 對元素流進行函數式操作
  6. Optional 解決NullPointerException
  7. Date Time API
  8. 重複註解 @Repeatable
  9. Base64
  10. 使用元空間Metaspace代替持久代(PermGen space)

Java7(2011.7)(LTS版本)

  1. switch 支援String字串型別
  2. try-with-resources,資源自動關閉
  3. 整數型別能夠用二進位制來表示
  4. 數位常數支援下劃線
  5. 泛型範例化型別自動推斷,即」<>」
  6. catch捕獲多個異常型別,用(|)分隔開
  7. 全新的NIO2.0 API
  8. Fork/join 並行執行任務的框架

Java6(2006)

  1. java.awt新增Desktop類和SystemTray類
  2. 使用JAXB2來實現物件與XML之間的對映
  3. 輕量級 Http Server API
  4. 插入式註解處理API(lombok使用該特性來實現的)
  5. STAX,處理XML檔案的API
  6. Compiler API
  7. 對指令碼語言的支援(ruby, groovy, javascript)

Java 5(2004)

  1. 泛型(本質是引數化型別,解決不確定具體物件型別的問題)
  2. 增強的for迴圈(for-each)
  3. 自動裝箱和自動拆箱(包裝型別有:Integer,Double,Float,Long,Short,Character和Boolean)
  4. 型別安全的列舉(enum)
  5. 可變長度引數
  6. 靜態引入(import static)
  7. 後設資料(註解)
  8. 執行緒並行庫(java.util.concurrent)

java1.4(2004)

  1. XML解析器
  2. Java列印服務
  3. Logging API(紀錄檔功能)
  4. Java Web Start
  5. JDBC 3.0 API(jdbc高階)
  6. 斷言
  7. Preferences API
  8. 鏈式例外處理
  9. 支援IPV6
  10. 支援正規表示式
  11. 引入Imgae I/O API (圖片流);
  12. NIO(高階流)
  13. XSLT轉換器

java1.3 (2000)

  1. Timer API(時間)
  2. Java Sound API(聲音)
  3. RMI通訊協定
  4. jar檔案索引
  5. 優化和增強

java1.2 (1998)

  1. J2SE/J2EE/J2ME
  2. EJB
  3. Java IDL(平臺物件請求代理體系結構)
  4. 集合框架
  5. JIT(Just In Time)編譯器
  6. 數位簽章
  7. JFC(Java Foundation Classes), 包括Swing1.0, 拖放和Java2D類庫
  8. Java Plug-In(執行外掛)
  9. JDBC中引入可捲動結果集,BLOB,CLOB,批次更新和使用者自定義型別
  10. Applet中新增聲音支援
  11. 字串常數做記憶體對映
  12. 控制授權/存取系統資源的策略工具

java1.1 (1997)

  1. JAR
  2. JDBC
  3. JavaBean
  4. RMI(遠端呼叫)
  5. Inner Class(內部類)
  6. Reflection(反射)

java1.0 (1996 初代版本)

  1. Classic VM(虛擬機器器)
  2. Applet(java小應用程式)
  3. AWT(java圖形設計)

下圖是 Oracle 官方給出的 Oracle JDK 支援的時間線。
LTS:是 Long Term Support,Oracle官宣可以免費商用的LTS版本,也就是官方保證會長期支援的版本。

參考連結:
https://blog.oxings.com/article/31.html
https://mp.weixin.qq.com/s/YPJ-sfx04-fOGt4WuPDwIQ