前言
JDK 1.4 (2002)、1.5 (2004)、1.6 (2006) 是 Java 發展史上極具里程碑意義的三個版本。它們確立了現代 Java 生態的基礎設施:集合框架成熟、泛型/註解/枚舉/自動拆裝箱、動態編譯/監控工具/腳本引擎。本文從語言特性、核心庫、JVM/工具、效能四大維度深度對比,幫助理解版本演進脈絡。
一、JDK 1.4 (Merlin, 2002) - 基礎設施奠基期
語言層面
- assert 關鍵字:斷言機制,開發期自檢,運行時需 `-ea` 啟用。
- 正則表達式:`java.util.regex` (Pattern/Matcher),Perl 風格語法。
- 鏈式異常:`Throwable.initCause()` / `getCause()`,保留原始堆疊。
核心庫重磅新增
- NIO (New I/O):`java.nio.*` - Channel、Buffer、Selector,**非阻塞 I/O** 基石,Netty/Mina 等高性能網路框架之母。
- Logging API:`java.util.logging` (JUL),標準化日誌門面 (雖後被 Log4j/Slf4j 取代)。
- Preferences API:跨平台配置存儲 (Windows Registry / Linux .files)。
- JDBC 3.0:Savepoint、ParameterMetaData、自動生成鍵獲取。
- XML 處理:JAXP 1.2 (SAX/DOM/XSLT 標準化)、SOAP with Attachments (SAAJ)。
JVM/工具
- 啟動類加載器優化、信號處理改進。
- 引入 `jconsole` (實驗性)、`jmap`、`jstack` 等診斷工具雛形。
二、JDK 1.5 (Tiger, 2004) - 語法糖與元編程革命
語言特性 (五大語法糖)
- 泛型:類型擦除實現,編譯期類型安全,消除強轉,集合框架全面泛型化。
- 註解:`@Override`、`@Deprecated`、`@SuppressWarnings` + 自定義註解 + APT (Annotation Processing Tool) 編譯時處理,**框架配置從 XML 轉向註解的起點**。
- 枚舉:`enum` 類型安全單例、策略模式最佳載體,`EnumSet`/`EnumMap` 高性能專用集合。
- 自動拆裝箱:基本類型與包裝類自動轉換,減少樣板碼 (注意 NPE 與性能陷阱)。
- 可變參數:`method(String... args)` 簡化數組構造。
核心庫擴充
- JUC (java.util.concurrent):Doug Lea 鉅獻,**AQS、線程池、併發容器、鎖、同步器** 完整併發套件,終結自寫鎖時代。
- Scanner:簡化輸入解析 (正則分隔)。
- Formatter / printf:C 風格格式化輸出。
- 靜態導入:`import static java.lang.Math.*`。
- 增強 for 循環:`for (T t : collection)`,語法糖編譯為 Iterator。
JVM/工具巨大躍進
- JMX (Java Management Extensions):標準化管理代理,MBean、MXBean,JConsole 正式可用。
- JVM TI (Tool Interface):取代 JVMDI/JVMPI,Profiler/Agent 標準接口。
- 類數據共享 (CDS):啟動加速 (後續 AppCDS 擴展)。
- 擴展類加載器重構。
三、JDK 1.6 (Mustang, 2006) - 效能優化與工具生態成熟期
語言/編譯器
- JSR 269 - 編譯器插入式註解處理 API:`javax.annotation.processing`,取代 APT,Lombok/MapStruct/MyBatis 等編譯時增強基石。
- JSR 223 - 腳本引擎 API:`javax.script`,內建 Rhino (JavaScript),支援 Groovy/JRuby/Jython 等,Java 應用可嵌入動態腳本。
- JSR 250 - 通用註解:`@Resource`、`@PostConstruct`、`@PreDestroy` 等,Java EE/ Spring 共用。
核心庫增強
- JDBC 4.0:Driver 自動載入 (SPI)、RowId、National Character、SQLXML、Wrapper 接口解耦。
- Java Compiler API:`javax.tools.JavaCompiler`,運行時動態編譯 (JSP 引擎、動態代理生成基石)。
- 輕量級 HTTP Server:`com.sun.net.httpserver` (內建簡易 HTTP 伺服器)。
- Swing 改進:系統觀感、雙緩衝、錶格渲染優化。
JVM 效能大優化 (核心亮點)
- 鎖優化:偏向鎖、輕量級鎖 (CAS)、鎖粗化、鎖消除、適應性自旋,**synchronized 性能逼近 ReentrantLock**。
- 逃逸分析 + 標量替換 + 栈上分配**:未逃逸對象不進堆,字段拆解為局部變量,極大減輕 GC 壓力。
- 壓縮指針 (-XX:+UseCompressedOops):32 位指針訪問 32GB 堆,節省 30-50% 內存。
- Parallel GC / CMS GC 改進:並行老年代、CMS 並發預清理、降低停頓。
- 類加載優化:模塊化類加載、啟動速度提升。
監控診斷工具全家桶 (生產級就緒)
- jconsole:JMX 圖形化監控 (內存、執行緒、類、MBean 操作)。
- jvisualvm:整合 jmap/jstack/jstat/profiler,CPU/內存採樣、Heap Dump 分析、GC 視覺化。
- jstat / jstatd:命令列 GC/類加載/編譯統計,遠程監控。
- jmap / jhat:Heap Dump 與分析 (後續 JVisualVM 整合)。
- jstack:線程堆疊快照,死鎖檢測。
四、版本對比總結表
| 維度 | JDK 1.4 | JDK 1.5 | JDK 1.6 |
| 發布年份 | 2002 | 2004 | 2006 |
| 語言核心 | assert、Regex、鏈式異常 | 泛型、註解、枚舉、拆裝箱、可變參數、for-each | 編譯器註解處理、腳本引擎、通用註解 |
| 併發/集合 | - | JUC 全家桶 (AQS、CAS、線程池) | 鎖優化、並行 GC、逃逸分析 |
| I/O/網路 | NIO (Channel/Selector) | - | 輕量 HTTP Server |
| 監控工具 | 雛形 | JMX、JConsole、JVM TI | VisualVM、jstat、jmap、jstack 完整鏈 |
| 企業級就緒度 | 基礎 | 成熟 (Spring 2.0 基於 1.5) | 高性能、可觀測、生產級標配 |
五、遷移與兼容性提醒
- 類文件版本:1.4=48.0, 1.5=49.0, 1.6=50.0。高版本編譯需 `-target` 兼容低版本運行。
- 泛型擦除:運行時無泛型信息,橋接方法、原始類型兼容需注意。
- NIO 非阻塞:Selector 輪詢模型,Netty 封裝後才生產易用。
- JDBC Driver SPI:1.6+ 無需 `Class.forName()`,`META-INF/services/java.sql.Driver` 自動發現。
六、結語
JDK 1.4 奠基 NIO/Logging,1.5 爆發語法糖與 JUC 併發框架,1.6 則將 JVM 效能推向新高度並完善工具鏈。這三版合力構建了 Java 企業級開發的**黃金十年基石**。雖然當前已進入 JDK 17/21 LTS 時代,但理解演進歷史,能讓你在排查疑難雜症、優化舊系統、設計新架構時,擁有穿透本質的歷史視角。