跳到主要内容 从 Java 8 升级到 Java 21:核心新特性对比与实战指南 | 极客日志
Java java
从 Java 8 升级到 Java 21:核心新特性对比与实战指南 本文对比 Java 8 与 Java 21 的核心差异,涵盖 instanceof 模式匹配、Switch 表达式、虚拟线程、Record 类等新特性。通过代码示例展示语法简化与性能提升,如 HTTP Client API 优化、不可变集合创建及 G1/ZGC 垃圾回收器改进。建议开发者结合 Spring Boot 3.x 趋势,评估升级至长期支持版本(LTS)以提升开发效率与系统性能。
1.背景
Oracle 在 2014 年发布了 JDK8,成为 Java 开发最主流的版本。时隔十年,Java 已发布到 JDK24 版本。在众多版本中,JDK8、JDK11、JDK17、JDK21 和最新发布的 JDK25 是 Oracle 官方长期支持维护的版本。
本文将结合日常使用新特性的经验,详细对比 Java 8 与 Java 21 的实现方式,展示升级带来的新特性如何让开发变得高效优雅。文中将标注每个特性的引入预览版本、转正版本以及实用性推荐指数。
2.预览新特性
预览新特性是指功能的设计、规格和实现是完整的,但不是永久性的。该功能可能以其他形式存在或在将来的 JDK 版本中被移除。要编译和运行包含预览功能的代码,必须指定命令行选项 --enable-preview。
简单来说,预览功能旨在让用户试用并验证实用性,最终决定是否正式发布。这是 JDK 作为标准平台增加新特性的科学严谨态度。
3.instanceof 模式匹配
instanceof 用于对象类型判断,常用于统一响应结果封装和全局异常处理。
Java 8
if (e instanceof MethodArgumentNotValidException) {
MethodArgumentNotValidException methodArgumentNotValidException = (MethodArgumentNotValidException) e;
BindingResult result = methodArgumentNotValidException.getBindingResult();
}
Java 21
if (e instanceof MethodArgumentNotValidException methodArgumentNotValidException) {
BindingResult result = methodArgumentNotValidException.getBindingResult();
}
Java 8 需要先判断类型再强制转换,代码冗余。Java 21 写法更优雅,一步到位。
引入版本 :JDK 14 (预览),JDK 16 转正
实用推荐指数 :⭐️⭐️⭐️⭐️⭐️
4.Switch 表达式
增强后的 switch 避免了漏写 break 导致 bug 的问题,代码更整洁。
Java 8
String dayType;
switch (day) {
:
:
:
:
:
dayType = ;
;
:
:
dayType = ;
;
:
( + day);
}
微信扫一扫,关注极客日志 微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具 Keycode 信息 查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
Escape 与 Native 编解码 JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
JavaScript / HTML 格式化 使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
JavaScript 压缩与混淆 Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
case
1
case
2
case
3
case
4
case
5
"Weekday"
break
case
6
case
7
"Weekend"
break
default
throw
new
IllegalArgumentException
"Invalid day: "
String dayType = switch (day) {
case 1 , 2 , 3 , 4 , 5 -> "Weekday" ;
case 6 , 7 -> "Weekend" ;
default -> throw new IllegalArgumentException ("Invalid day: " + day);
};
增强后代码紧凑简洁,直接返回值,避免漏写 break。
引入版本 :JDK 12(预览),JDK 14 转正
实用推荐指数 :⭐️⭐️⭐️⭐️⭐️
5.模式匹配 switch 基于 instanceof 和 switch 的增强,支持类型判断与条件判断结合。
String format (Object obj) {
if (obj instanceof Integer) {
return String.format("int %d" , obj);
} else if (obj instanceof Long) {
return String.format("long %d" , obj);
} else if (obj instanceof Double) {
return String.format("double %f" , obj);
} else if (obj instanceof String) {
return String.format("String %s" , obj);
}
return obj.toString();
}
String format (Object obj) {
return 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);
case null -> "null" ;
default -> obj.toString();
};
}
引入版本 :JDK 17 (预览),JDK 21 转正
实用推荐指数 :⭐️⭐️⭐️⭐️
6.文本块 JDK 引入三重双引号来定义多行文本,自动处理缩进和换行,适合 SQL、JSON、HTML 等场景。
String jsonStr = "{\n" +
" \"name\":\"张三\",\n" +
" \"age\":18\n" +
"}\n" ;
String jsonStr = """
{
"name":"张三",
"age":38
}
""" ;
引入版本 :JDK 13(预览),JDK 15 转正
实用推荐指数 :⭐️⭐️⭐️⭐️⭐️
7.HTTP Client API JDK 原生提供的 HTTP Client 功能更简洁,支持同步/异步,内置超时和重试机制。
HttpURLConnection connection = (HttpURLConnection) new URL (url).openConnection();
connection.setRequestMethod("GET" );
try (BufferedReader in = new BufferedReader (
new InputStreamReader (connection.getInputStream()))) {
String inputLine;
while ((inputLine = in.readLine()) != null ) {
response.append(inputLine);
}
}
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.timeout(Duration.ofSeconds(10 ))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
引入版本 :JDK11 正式
实用推荐指数 :⭐️⭐️⭐️⭐️
8.局部变量类型推断 var var 定义局部变量可减少样板代码,提高可读性,特别是泛型嵌套场景。
Map<String, List<Employee>> employeeMap = new HashMap <String, List<Employee>>();
Iterator<Map.Entry<String, List<Employee>>> iterator = employeeMap.entrySet().iterator();
var employeeMap = new HashMap <String, List<Employee>>();
var iterator = employeeMap.entrySet().iterator();
9.虚拟线程 (Virtual Threads) JDK 21 的重磅特性,虚拟线程是 JVM 实现的轻量级线程,许多虚拟线程共享同一个操作系统线程,极大提高了处理性能和吞吐量。
ExecutorService executor = Executors.newFixedThreadPool(200 );
Future<String> future = executor.submit(() -> {
return httpClient.get(url);
});
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
Future<String> future = executor.submit(() -> {
return httpClient.get(url);
});
}
引入版本 :JDK 19(预览),JDK 21 转正
实用推荐指数 :⭐️⭐️⭐️⭐️⭐️
10.Record 类 record 关键字可简化数据类的定义,自动生成访问方法、toString()、hashCode()、equals() 方法。
public class Employee {
private final String name;
private final String department;
private final int salary;
}
public record Employee (String name, String department, int salary) {}
引入版本 :JDK 14(预览),JDK 16 转正
实用推荐指数 :⭐️⭐️⭐️
11.快速创建不可变集合 JDK 提供原生方法创建不可变集合,无需引入 Guava 依赖。
List<String> list = Collections.unmodifiableList(Arrays.asList("a" , "b" ));
List<String> list = List.of("a" , "b" , "c" );
Set<String> set = Set.of("a" , "b" , "c" );
Map<String, Integer> map = Map.of("a" , 1 , "b" , 2 );
引入版本 :JDK 9 正式
实用推荐指数 :⭐️⭐️⭐️
12.Try-With-Resources 改进 try (FileInputStream fileInputStream = new FileInputStream ("" );
FileOutputStream fileOutputStream = new FileOutputStream ("" )) {
} catch (IOException e) {
e.printStackTrace();
}
FileInputStream fis = new FileInputStream ("" );
FileOutputStream fos = new FileOutputStream ("" );
try (fis; fos) {
} catch (IOException e) {
e.printStackTrace();
}
引入版本 :JDK 9 正式
实用推荐指数 :⭐️⭐️⭐️⭐️
13.Sequenced Collections 序列化集合(有序集合)提供了处理第一个和最后一个元素以及反向视图的方法。
List<Integer> list = new ArrayList <>();
if (!list.isEmpty()) {
Integer first = list.get(0 );
Integer last = list.get(list.size() - 1 );
}
List<Integer> list = new ArrayList <>();
if (!list.isEmpty()) {
Integer first = list.getFirst();
Integer last = list.getLast();
}
引入版本 :JDK 21 正式
实用推荐指数 :⭐️⭐️⭐️⭐️
14.其他新特性
接口私有方法
String 类、stream 流、optional、Files 类等增强
NullPointerException 异常精确提示
Sealed Classes 密封类
使用方法句柄重新实现反射核心,提升反射性能
Scoped Values (预览) :替代 ThreadLocal 的更优方案,尤其是在使用大量虚拟线程时。
更多特性详情可参考 JavaGuide 官方网站。
下图展示了从 JDK 8 到 JDK 24 每个版本的更新特性数量和更新时间:
15.总结 JDK 每个版本均围绕开发效率、性能、可维护性进行改进。随着版本升级,垃圾回收器性能也显著提升。从 JDK 9 开始 G1 成为默认垃圾回收器,JDK 11 引入了 ZGC(Z Garbage Collector),停顿时间不超过 10ms,支持高达 16TB 堆空间。
Spring Boot 3.x 将基于 Java 17 开发,这标志着生态趋势要求升级。建议开发者评估升级至长期支持版本(LTS),如 Java 17 或 21,以提升开发体验与系统性能保障。