Java Development Kit(JDK)是 Java 编程的核心工具包,不同版本的 JDK 引入了各种新特性、性能优化和安全性增强。以下详细介绍 JDK 8、JDK 11、JDK 17 和 JDK 21 这几个主流版本的区别。
发布时间与支持周期
- JDK 8:于 2014 年 3 月发布,它是 Java 历史上最成功、使用最广泛的版本之一。其长期支持(LTS)截止日期为 2030 年 12 月。
- JDK 11:在 2018 年 9 月发布,同样是 LTS 版本,Oracle 对其支持到 2026 年 9 月,OpenJDK 社区支持到 2029 年 9 月。
- JDK 17:发布于 2021 年 9 月,属于 LTS 版本,Oracle 支持至 2024 年 9 月,OpenJDK 社区会支持到 2029 年 9 月。
- JDK 21:在 2023 年 9 月发布,是最新的 LTS 版本,Oracle 支持到 2026 年 9 月,OpenJDK 社区支持到 2031 年 9 月。
新特性对比
语言特性
- JDK 8
- Lambda 表达式:允许把函数作为一个方法的参数传递,使代码更简洁,例如:
- Stream API:用于处理集合元素,提供了过滤、映射、排序等功能,极大简化了集合操作。
- 接口默认方法和静态方法:接口中可以定义默认方法和静态方法,为接口增加了更多的灵活性。
- JDK 11
- 局部变量类型推断:使用
var
关键字可以让编译器自动推断局部变量的类型,减少代码冗余。
- 字符串 API 增强:增加了
isBlank()
、strip()
、repeat()
等方法,方便对字符串进行处理。
- JDK 17
- 密封类和接口:通过
sealed
、permits
关键字限制类的继承或接口的实现,增强了代码的安全性和可维护性。
- 模式匹配(instanceof):在
instanceof
运算符中可以直接进行类型转换和赋值,简化代码逻辑。
- JDK 21
- 虚拟线程:轻量级线程,由 JVM 调度,可显著提高并发性能,减少线程上下文切换开销。
- Record 模式和模式匹配增强:进一步增强了模式匹配的功能,支持在记录类上进行模式匹配。
垃圾回收器
- JDK 8:默认的垃圾回收器是 Parallel GC,它是一种多线程的垃圾回收器,注重吞吐量。
- JDK 11
- ZGC(Z Garbage Collector):可扩展的低延迟垃圾回收器,目标是在处理大堆时实现亚毫秒级的停顿时间。
- 默认垃圾回收器变更:默认垃圾回收器变为 G1(Garbage - First),G1 在兼顾吞吐量的同时,能更好地控制停顿时间。
- JDK 17
- Shenandoah GC:作为实验特性引入,旨在实现与应用线程并发的垃圾回收,减少停顿时间。
- 移除 CMS(Concurrent Mark Sweep)垃圾回收器:CMS 在处理大堆时存在一些性能问题,因此被移除。
- JDK 21
- Epsilon GC:作为无操作的垃圾回收器,仅分配内存,不进行垃圾回收,适用于性能测试等场景。
模块化系统
- JDK 8:没有模块化系统,项目依赖管理相对复杂,容易出现类路径冲突等问题。
- JDK 11
- Jigsaw 项目成果:引入模块化系统,将 Java 平台和应用程序组织成模块,提高了代码的可维护性和安全性。模块通过
module-info.java
文件定义,明确声明依赖和导出的包。
- JDK 17 和 JDK 21:进一步完善了模块化系统,提供了更好的工具和特性来支持模块开发和管理。
性能与兼容性
- 性能:随着版本的更新,JDK 在性能上不断优化。例如,JDK 11 及以后版本引入的新垃圾回收器和优化的代码执行引擎,使得应用程序在内存管理和执行速度上有了显著提升。特别是 JDK 21 的虚拟线程,为高并发场景带来了质的飞跃。
- 兼容性:高版本 JDK 通常向下兼容,但某些旧代码可能需要进行修改才能在新 JDK 上运行。例如,JDK 17 移除了一些过时的 API 和功能,使用这些 API 的代码需要进行调整。