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 表达式:允许把函数作为一个方法的参数传递,使代码更简洁,例如:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.forEach(n -> System.out.println(n));
  • 1.
  • 2.
  • Stream API:用于处理集合元素,提供了过滤、映射、排序等功能,极大简化了集合操作。
List<Integer> evenNumbers = numbers.stream()
                                   .filter(n -> n % 2 == 0)
                                   .collect(Collectors.toList());
  • 1.
  • 2.
  • 3.
  • 接口默认方法和静态方法:接口中可以定义默认方法和静态方法,为接口增加了更多的灵活性。
interface MyInterface {
    default void defaultMethod() {
        System.out.println("This is a default method.");
    }
    static void staticMethod() {
        System.out.println("This is a static method.");
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • JDK 11
  • 局部变量类型推断:使用var关键字可以让编译器自动推断局部变量的类型,减少代码冗余。
var list = new ArrayList<String>();
  • 1.
  • 字符串 API 增强:增加了isBlank()strip()repeat()等方法,方便对字符串进行处理。
String str = "  Hello  ";
System.out.println(str.isBlank()); 
System.out.println(str.strip());  
System.out.println(str.repeat(3));
  • 1.
  • 2.
  • 3.
  • 4.
  • JDK 17
  • 密封类和接口:通过sealedpermits关键字限制类的继承或接口的实现,增强了代码的安全性和可维护性。
sealed class Shape permits Circle, Rectangle { }
final class Circle extends Shape { }
final class Rectangle extends Shape { }
  • 1.
  • 2.
  • 3.
  • 模式匹配(instanceof):在instanceof运算符中可以直接进行类型转换和赋值,简化代码逻辑。
if (obj instanceof String s) {
    System.out.println(s.length());
}
  • 1.
  • 2.
  • 3.
  • JDK 21
  • 虚拟线程:轻量级线程,由 JVM 调度,可显著提高并发性能,减少线程上下文切换开销。
ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();
executor.submit(() -> {
    System.out.println("Running on a virtual thread.");
});
executor.shutdown();
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 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文件定义,明确声明依赖和导出的包。
module myModule {
    requires otherModule;
    exports com.example.myPackage;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • JDK 17 和 JDK 21:进一步完善了模块化系统,提供了更好的工具和特性来支持模块开发和管理。

性能与兼容性

  • 性能:随着版本的更新,JDK 在性能上不断优化。例如,JDK 11 及以后版本引入的新垃圾回收器和优化的代码执行引擎,使得应用程序在内存管理和执行速度上有了显著提升。特别是 JDK 21 的虚拟线程,为高并发场景带来了质的飞跃。
  • 兼容性:高版本 JDK 通常向下兼容,但某些旧代码可能需要进行修改才能在新 JDK 上运行。例如,JDK 17 移除了一些过时的 API 和功能,使用这些 API 的代码需要进行调整。

综上所述,每个版本的 JDK 都有其独特的特性和优势,开发者可以根据项目的需求、性能要求和兼容性等因素选择合适的 JDK 版本。