以下是 JDK(Java Development Kit)從發布至今所有主要版本 的詳細差異、新增特性及關鍵更新的總結,按時間順序排列:
1. JDK 1.0 (1996)
- 發布年份:1996年1月23日
- 關鍵特性:
- Java首次正式發布。
- 核心語言特性:類、接口、異常處理。
- 核心API:
java.lang
、java.io
、java.awt
(圖形界面庫)。
2. JDK 1.1 (1997)
- 發布年份:1997年2月19日
- 關鍵特性:
- 內省(Reflection):允許運行時檢查類和方法。
- JDBC(Java Database Connectivity):數據庫連接API。
- 匿名內部類:簡化事件監聽器等場景。
java.util
擴展:新增Hashtable
、Vector
等集合類。
3. JDK 1.2 (1998)
- 發布年份:1998年12月8日
- 關鍵特性:
- 命名改為JDK 1.2(原計劃為JDK 2.0,但版本號保留1.x)。
- Collections Framework:引入
ArrayList
、HashMap
等通用集合類。 strictfp
關鍵字:確保浮點運算的平臺一致性。Thread
類增強:join()
、sleep()
等方法。
4. JDK 1.3 (2000)
- 發布年份:2000年5月8日
- 關鍵特性:
- HotSpot JVM:取代原來的JIT編譯器,顯著提升性能。
javax
包擴展:javax.sound
(音頻處理)javax.management
(JMX管理)javax.swing
(改進的GUI庫)。
- 增強的I/O(NIO前身):初步支持非阻塞I/O。
5. JDK 1.4 (2002)
- 發布年份:2002年2月6日
- 關鍵特性:
- 正則表達式(Regex):
java.util.regex
包。 assert
關鍵字:斷言機制(調試工具)。- 日志API:
java.util.logging
。 - 改進的I/O(NIO前身):
RandomAccessFile
、FileChannel
。 - 圖像處理增強:
java.awt.image
包。
- 正則表達式(Regex):
6. JDK 5 (2004)
- 發布年份:2004年9月30日
- 關鍵特性:
- 泛型(Generics):類型參數化(如
List<String>
)。 - 注解(Annotations):
@Override
、@Deprecated
等元數據標記。 - 自動裝箱/拆箱:基本類型與包裝類自動轉換。
- 枚舉(Enums):類型安全的枚舉類型。
- 可變參數(Varargs):方法參數可接受可變數量的參數(如
method(int... args)
)。 - 靜態導入:通過
import static
直接導入靜態方法或常量。
- 泛型(Generics):類型參數化(如
7. JDK 6 (2006)
- 發布年份:2006年12月11日
- 關鍵特性:
- 腳本引擎(Scripting Engine):支持JavaScript等腳本語言嵌入Java應用。
- Java DB(Derby):內置數據庫。
- JVM改進:性能優化(如垃圾回收算法改進)。
- 注解擴展:
@SafeVarargs
、@FunctionalInterface
(后移至JDK 8)。 - XML數字簽名:增強安全性。
8. JDK 7 (2011)
- 發布年份:2011年7月28日
- 關鍵特性:
-
try-with-resources:自動關閉資源(如
FileInputStream
)。try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {// 自動關閉br }
-
鉆石操作符(Diamond Operator):簡化泛型實例化。
List<String> list = new ArrayList<>(); // 無需重復指定類型
-
字符串切換(String in Switch):允許
switch
語句使用字符串。 -
NIO.2:增強的文件系統API(路徑操作、文件監控)。
-
Fork/Join框架:支持分治算法的并行計算。
-
9. JDK 8 (2014)
- 發布年份:2014年3月18日
- 關鍵特性:
-
Lambda表達式:引入函數式編程支持。
list.forEach(item -> System.out.println(item));
-
Stream API:對集合進行聲明式數據處理。
List<String> filtered = list.stream().filter(s -> s.length() > 3).collect(Collectors.toList());
-
默認方法(Default Methods):接口中可定義默認實現。
-
新的日期時間API(java.time包):替代
Date
和Calendar
。 -
Optional類:避免空指針異常。
-
并行數組排序:
Arrays.parallelSort()
。
-
10. JDK 9 (2017)
- 發布年份:2017年9月21日
- 關鍵特性:
-
模塊化系統(JPMS):通過
module-info.java
定義模塊。module com.example {requires java.logging;exports com.example.service; }
-
私有化JDK內部API:減少對
sun.misc
等包的依賴。 -
HTTP Client(Preview):內置HTTP客戶端(
java.net.http
包)。 -
JShell:交互式Java REPL(Read-Eval-Print Loop)。
-
集合工廠方法:簡化不可變集合創建。
List<String> list = List.of("a", "b", "c");
-
11. JDK 10 (2018)
- 發布年份:2018年3月20日
- 關鍵特性:
-
局部變量類型推斷(var):通過
var
聲明局部變量。var list = new ArrayList<String>(); // 類型由初始化表達式推斷
-
應用類數據共享(AppCDS):減少JVM內存占用。
-
垃圾回收器改進:并行垃圾回收器(Parallel GC)默認替換CMS。
-
實驗性特性:
String
的indent()
、describeConstable()
等。
-
12. JDK 11 (2018, LTS)
- 發布年份:2018年9月25日
- 關鍵特性:
- HTTP Client正式版:從Preview升級為穩定版本。
- Windows上的Flight Recorder(JFR):性能分析工具。
- 新的垃圾回收器ZGC:低延遲垃圾回收器(實驗性)。
- 刪除Java EE模塊:移除
java.xml.bind
等模塊。 - 文本塊(Text Blocks):多行字符串支持。
String html = """<div><p>Hello World</p></div>""";
13. JDK 12 (2019)
- 發布年份:2019年3月19日
- 關鍵特性:
- Switch表達式(Preview):支持
yield
和表達式形式。 - 垃圾回收器改進:
G1
垃圾回收器的-XX:ZapUnusedHeapArea
參數。 - Shenandoah GC(實驗性):低暫停時間垃圾回收器。
- 字符串壓縮(Compact Strings):優化字符串存儲。
- Switch表達式(Preview):支持
14. JDK 13 (2019)
- 發布年份:2019年9月17日
- 關鍵特性:
- 文本塊(Text Blocks)正式版:從Preview升級為穩定版本。
- Switch表達式改進:支持
yield
和case
合并。 - 記錄類(Records,Preview):簡化數據載體類的定義。
public record Person(String name, int age) { }
15. JDK 14 (2020)
- 發布年份:2020年3月17日
- 關鍵特性:
-
記錄類(Records):從Preview升級為穩定版本。
-
模式匹配(Pattern Matching):初步支持
instanceof
后直接解構對象(Preview)。if (obj instanceof Person p) {System.out.println(p.name); }
-
可變參數的私有方法:允許私有方法使用可變參數。
-
文本分段(Text Blocks改進):支持轉義字符。
-
16. JDK 15 (2020)
- 發布年份:2020年9月15日
- 關鍵特性:
-
密封類(Sealed Classes):限制哪些類可以繼承當前類(Preview)。
public sealed class Shape permits Circle, Rectangle { }
-
隱藏類(Hidden Classes):用于生成臨時類(如代理類)。
-
增強的
switch
表達式:返回值并支持yield
。 -
Text Blocks
改進:支持轉義字符和更靈活的語法。
-
17. JDK 16 (2021)
- 發布年份:2021年3月16日
- 關鍵特性:
- 棄用
removeIf
的并發修改:修復ConcurrentModificationException
。 - 虛擬線程(Virtual Threads):實驗性輕量級線程(Preview)。
- 簡化的
switch
語法:允許yield
和表達式形式。 - 強封裝(Strong Encapsulation):強制限制對內部API的訪問。
- 棄用
18. JDK 17 (2021, LTS)
- 發布年份:2021年9月14日
- 關鍵特性:
- 密封類(Sealed Classes):從Preview升級為穩定版本。
- 文本塊改進:支持轉義字符和更靈活的語法。
- 強封裝(Strong Encapsulation):默認禁用內部API訪問。
- 新的垃圾回收器Shenandoah:低暫停時間GC(實驗性)。
- 移除
javaws
和applet
:淘汰舊版瀏覽器插件技術。
19. JDK 18 (2022)
- 發布年份:2022年3月15日
- 關鍵特性:
- 虛擬線程(Virtual Threads):從Preview升級為穩定版本。
- 結構化并發(Structured Concurrency):通過
StructuredTaskScope
管理線程。 - 向量API(Vector API):支持SIMD指令優化計算密集型代碼(Preview)。
- 模式匹配改進:支持
instanceof
后直接解構嵌套對象。
20. JDK 19 (2022)
- 發布年份:2022年9月19日
- 關鍵特性:
- 虛擬線程改進:支持
Stack Walking
和Thread.startVirtual()
。 - 模式匹配for
switch
:支持switch
表達式匹配記錄類。 - 精確的ARC(Accurate Race Conditions):改進競爭條件檢測。
- 記錄模式(Record Patterns):解構記錄類字段。
if (obj instanceof Person(String name)) { ... }
- 虛擬線程改進:支持
21. JDK 20 (2023)
- 發布年份:2023年3月21日
- 關鍵特性:
- 模式匹配for
switch
正式版:從Preview升級為穩定版本。 - 記錄模式增強:支持嵌套記錄的解構。
- 虛擬線程改進:支持
Thread.startVirtual()
。 - 強封裝增強:進一步限制內部API訪問。
Vector API
改進:支持更多硬件指令集。
- 模式匹配for
22. JDK 21 (2023)
- 發布年份:2023年9月19日
- 關鍵特性:
- 虛擬線程改進:支持
Stack Walking
和Thread.startVirtual()
。 Vector API
改進:支持更多CPU指令集(如AVX512)。JFR
增強:更詳細的性能分析事件。String
分割優化:String.split()
支持正則表達式改進。Record
類改進:支持private
構造函數。
- 虛擬線程改進:支持
23. JDK 22 (2024)
- 發布年份:2024年3月19日
- 關鍵特性:
Vector API
改進:支持更多CPU指令集(如AVX512)。Record
類改進:支持private
構造函數。JFR
增強:更詳細的性能分析事件。String
拼接優化:+
操作符的性能提升。
LTS版本推薦
- 長期支持(LTS)版本:每3年發布一次,提供更長時間的維護和支持。
- JDK 8(2014,支持至2030)
- JDK 11(2018,支持至2029)
- JDK 17(2021,支持至2029)
- JDK 21(2023,支持至2030)
版本差異總結表
版本 | 關鍵特性 | LTS | 發布年份 |
---|---|---|---|
JDK 5 | 泛型、注解、枚舉 | 否 | 2004 |
JDK 7 | try-with-resources、NIO.2、Fork/Join | 否 | 2011 |
JDK 8 | Lambda、Stream API、新日期API | 是 | 2014 |
JDK 11 | HTTP Client正式版、文本塊、移除Java EE模塊 | 是 | 2018 |
JDK 17 | 密封類、虛擬線程、強封裝 | 是 | 2021 |
JDK 21 | 虛擬線程優化、Vector API、JFR增強 | 是 | 2023 |
注意事項
- 版本兼容性:升級JDK版本時需檢查依賴庫的兼容性(如Spring Boot對JDK版本的限制)。
- 性能調優:新版本通常包含GC和JIT編譯器優化,需重新調整JVM參數。
- 實驗性特性:帶有Preview或Incubating標簽的特性可能在后續版本中變更或移除。
通過選擇合適的JDK版本,可以更好地平衡功能需求、性能優化和長期維護成本。