一文详细梳理JDK 21相比JDK 8的主要新特性
作者:rchmin
从 JDK 8(2014年3月发布)到 JDK 21(2023年9月发布)的9年时间里,Java经历了巨大的变革。以下是主要的新特性对比:
一、语言特性重大革新
1.模块系统(Jigsaw)- JDK 9
模块化JDK和应用程序,解决JAR地狱问题
module-info.java文件定义模块依赖
2.局部变量类型推断(var)- JDK 10
java // JDK 8 List<String> list = new ArrayList<>(); // JDK 10+ var list = new ArrayList<String>(); var stream = list.stream();
3.文本块(Text Blocks)- JDK 15正式
java
// JDK 8
String html = "<html>\n" +
" <body>\n" +
" <p>Hello</p>\n" +
" </body>\n" +
"</html>\n";
// JDK 15+
String html = """
<html>
<body>
<p>Hello</p>
</body>
</html>
""";4.记录类(Records)- JDK 16正式
java
// JDK 8 - 需要大量样板代码
public class Person {
private final String name;
private final int age;
// 构造器、getter、equals、hashCode、toString...
}
// JDK 16+
public record Person(String name, int age) { }5.模式匹配
instanceof模式匹配 - JDK 16正式
java
// JDK 8
if (obj instanceof String) {
String s = (String) obj;
System.out.println(s.length());
}
// JDK 16+
if (obj instanceof String s) {
System.out.println(s.length());
}switch表达式和模式匹配 - JDK 21正式
java
// JDK 21
String formatted = switch (obj) {
case Integer i -> String.format("int %d", i);
case Long l -> String.format("long %d", l);
case Double d -> String.format("double %f", d);
case String s -> String.format("String %s", s);
default -> obj.toString();
};6.密封类(Sealed Classes)- JDK 17正式
java
// 限制哪些类可以继承
public sealed interface Shape
permits Circle, Rectangle, Triangle { }
public final class Circle implements Shape { }
public final class Rectangle implements Shape { }二、革命性并发特性
虚拟线程(Virtual Threads)- JDK 21正式
java
// 创建百万级轻量级线程
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
IntStream.range(0, 100_000).forEach(i -> {
executor.submit(() -> {
Thread.sleep(Duration.ofSeconds(1));
return i;
});
});
}三、API增强
1.集合工厂方法- JDK 9
java
// JDK 8 - 繁琐
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list = Collections.unmodifiableList(list);
// JDK 9+
List<String> list = List.of("A", "B", "C");
Set<String> set = Set.of("A", "B");
Map<String, Integer> map = Map.of("A", 1, "B", 2);2.Stream API增强
takeWhile/dropWhile - JDK 9
ofNullable - JDK 9
iterate增强 - JDK 9
3.Optional增强- JDK 9+
java
// JDK 9+
optional.ifPresentOrElse(
value -> System.out.println(value),
() -> System.out.println("空值")
);4.HTTP Client API- JDK 11正式
java
// 取代HttpURLConnection
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com"))
.build();
HttpResponse<String> response =
client.send(request, HttpResponse.BodyHandlers.ofString());5.新的日期时间API增强- JDK 8已有,后续版本增强
java // JDK 8引入,后续版本有增强 LocalDate date = LocalDate.now(); Instant instant = Instant.now();
四、性能与JVM改进
1.新的垃圾收集器
G1GC - JDK 9成为默认(替代Parallel GC)
ZGC - JDK 15生产就绪(低延迟)
Shenandoah - JDK 12生产就绪(低暂停时间)
2.应用程序类数据共享(AppCDS)- JDK 10+
减少启动时间,降低内存占用
3.JFR(Java Flight Recorder)生产就绪- JDK 11
性能诊断工具,现在免费使用
五、包和模块变化
Java EE模块移除- JDK 11
JAXB、JAX-WS、JAF等移到Jakarta EE
需要单独添加依赖
六、开发工具增强
1.jshell- JDK 9
Java REPL交互式环境
2.jpackage- JDK 16
打包自包含的Java应用程序
七、重要版本里程碑
| 版本 | 年份 | 关键特性 |
|---|---|---|
| JDK 8 | 2014 | Lambda、Stream API、新日期时间API |
| JDK 9 | 2017 | 模块系统、JShell、集合工厂方法 |
| JDK 11 | 2018 | LTS,局部变量类型推断,HTTP Client |
| JDK 17 | 2021 | LTS,密封类、模式匹配增强 |
| JDK 21 | 2023 | LTS,虚拟线程、结构化并发、分代ZGC |
八、迁移建议
需要特别注意的变化:
包结构调整:Java EE相关包已移除
默认GC改变:从Parallel GC变为G1GC
模块化:大型应用需要考虑模块化
API变化:许多API已被标记为废弃
立即价值:
虚拟线程 - 大幅提升并发性能
记录类 - 减少样板代码
模式匹配 - 更简洁的条件处理
文本块 - 更好的字符串处理
ZGC - 极低延迟垃圾回收
最低推荐版本:
新项目:直接从JDK 21 LTS开始
生产系统:至少升级到JDK 17 LTS
遗留系统:考虑逐步迁移到JDK 11 LTS作为中间步骤
JDK 21代表了Java平台的重大飞跃,特别在并发编程方面带来了革命性的改进,是现代Java开发的推荐起点。
总结
到此这篇关于详细梳理JDK21相比JDK8主要新特性的文章就介绍到这了,更多相关JDK21相比JDK8主要新特性内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
