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 21 | JDK 17 |
| 生产环境 | JDK 17 | JDK 11 |
| 学习尝鲜 | JDK 21 | — |
| 遗留系统维护 | 保持现状 | JDK 11 |
