以下是 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版本,可以更好地平衡功能需求、性能优化和长期维护成本。