Skip to content

Java 版本演进

选版本时经常纠结:JDK 8 还主流吗?JDK 17 和 21 怎么选?Java 每 6 个月发布一个新版本,但企业生产环境必须稳定。理解版本演进历史,才能做出正确的技术选型决策。

LTS 与非 LTS

Java 版本分两种:LTS 和非 LTS。

LTS(Long-Term Support)是长期支持版本,每两年发布一次,提供 8 年以上的安全更新和技术支持。非 LTS 版本每 6 个月发一次,支持周期只有 6 个月——适合尝鲜,不适合生产。

JDK 8 (2014) → JDK 11 (2018) → JDK 17 (2021) → JDK 21 (2023) → ...
        ↓              ↓              ↓              ↓
      LTS           LTS            LTS            LTS

重要 LTS 版本一览:

版本定位
JDK 8现代化起点,Lambda/Stream 奠定函数式基础
JDK 17当前生产环境首选,密封类/Pattern Matching 成熟
JDK 21虚拟线程时代,革新并发编程范式

里程碑版本

JDK 5 (2004) — 现代 Java 的起点

JDK 5 引入了现代 Java 的基础语法,大幅提升开发效率:

java
// 泛型:编译时类型安全检查
List<String> list = new ArrayList<String>();

// 自动装箱:基本类型与包装类自动转换
Integer num = 10;

// 增强 for 循环:简化集合迭代
for (String s : list) {
    System.out.println(s);
}

// 枚举类型:类型安全的常量
enum Season { SPRING, SUMMER, AUTUMN, WINTER }

JDK 5 是后续所有版本的基础,现有 Java 代码中几乎无处不在。

JDK 8 (2014) — 革命性版本

这是 Java 历史上最重要的版本,引入了函数式编程范式:

java
// Lambda 表达式:简化匿名内部类
list.forEach(s -> System.out.println(s));

// Stream API:声明式数据处理
List<String> result = list.stream()
    .filter(s -> s.startsWith("A"))
    .map(String::toUpperCase)
    .collect(Collectors.toList());

// Optional:优雅处理空值
String value = Optional.ofNullable(str).orElse("default");

应用场景:集合处理、并行计算、空值判断。

JDK 11 (2018) — 首个免费商用的 LTS

首个可免费商用的 LTS 版本,语言层面更简洁:

java
// 单文件运行:学习/测试更方便
// 命令行直接运行:java HelloWorld.java

// HTTP Client:终于有了标准异步 HTTP 库
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.example.com"))
    .build();

注意:JDK 11 移除了 javax.xml.bind 等模块,如果用到 JAXB 需要手动引入依赖。

JDK 17 (2021) — 稳定成熟

经过多个版本迭代的成熟 LTS,生产环境首选:

java
// 密封类:精确控制类继承层次
public sealed class Shape permits Circle, Rectangle, Triangle { }

// Pattern Matching for instanceof
if (obj instanceof String s) {
    System.out.println(s.length());
}

// Switch 表达式
String result = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> "6";
    case TUESDAY -> "7";
    case THURSDAY, SATURDAY -> "8";
    default -> {
        yield "0";
    }
};

JDK 21 (2023) — 虚拟线程时代

改变 Java 并发编程范式,解决高并发痛点:

java
// 虚拟线程(协程/轻量级线程)
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    IntStream.range(0, 10_000).forEach(i -> {
        executor.submit(() -> {
            Thread.sleep(Duration.ofSeconds(1));
            return i;
        });
    });
}

// 序列集合
SequencedCollection<String> collection = new ArrayList<>();
collection.addFirst("first");
collection.addLast("last");

虚拟线程让高并发服务器开发变得简单——轻松支撑百万连接不再是难题。

版本选择建议

场景推荐版本备选版本
新项目JDK 21JDK 17
生产环境JDK 17JDK 11
学习尝鲜JDK 21
遗留系统维护保持现状JDK 11

基于 VitePress 构建