主流几个JDK版本:JDK 8、JDK 11、JDK 17 和 JDK 21 的区别

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 numbers = Arrays.asList(1, 2, 3, 4, 5);

numbers.forEach(n -> System.out.println(n));

1.2.

Stream API:用于处理集合元素,提供了过滤、映射、排序等功能,极大简化了集合操作。

登录后复制

List 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();

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

密封类和接口:通过sealed、permits关键字限制类的继承或接口的实现,增强了代码的安全性和可维护性。

登录后复制

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 版本。

友情链接