前言
JDK 21
自发布以来,正好有契机,新项目使用了这一长期稳定的版本。经过一年的开发工作,现在我将从实际开发中的编码体验和实际的提升两个角度,分享使用感受。
对比条件说明:
本文将重点对比JDK 8
和JDK 21
,因为有对比才能有更直观的感受。
1. 实际开发中的编码体验
1.1. 新的语法变化和增强点
接口的私有方法
接口允许定义私有方法,方便代码复用且保持接口设计清晰。
interface MyInterface {
private void myPrivateMethod() {
// 私有方法
}
}
局部变量类型推断(var
)
减少手动声明变量类型的繁琐性,并支持在 Lambda 表达式中使用 var
。
var list = new ArrayList<String>();
BiConsumer<String, String> consumer = (var a, var b) -> {
System.out.println("a: " + a + ", b: " + b);
};
字符串处理的新方法
isBlank()
:检查字符串是否为空或仅包含空格。lines()
:将多行字符串转换为流。repeat()
:将字符串重复指定次数。
String multiline = "Line 1\nLine 2\nLine 3";
var lines = multiline.lines().collect(Collectors.toList());
System.out.println(lines); // 输出:[Line 1, Line 2, Line 3]
Switch 表达式增强
支持返回值,且可以使用更简洁的 Lambda
风格语法。
String message = switch (day) {
case "MONDAY" -> "Start of the week";
case "FRIDAY" -> "End of the work week";
default -> "Midweek";
};
多行字符串(Text Block)
使用 """
定义多行字符串,自动处理换行,减少手动拼接字符串的复杂性。
String textBlock = """
Hello, this is a text block!
You can write across multiple lines.
""";
模式匹配(Pattern Matching)
语法增强,直接在条件语句中绑定变量并进行类型转换。
if (obj instanceof String str) {
System.out.println("String: " + str.length());
}
Sealed 类
通过限制子类的类型范围,增强类层次结构的封装性和安全性。
sealed class Animal permits Dog, Cat {}
final class Dog extends Animal {}
final class Cat extends Animal {}
Record 类
用于表示不可变数据对象,自动生成常见方法(如构造器、equals()
、hashCode()
、toString()
等)。
public record Point(int x, int y) {}
字符串模板(String Template)
提供更简单的字符串插值方式,减少拼接字符串的繁琐性。
String name = "张三";
int age = 30;
String message = STR."Hello, \{name}! You are \{age} years old.";
一些其它的变化…
- 增强的异常处理: 对特定异常的捕获和处理可能更加灵活。
- 泛型的改进: 某些场景下的泛型推导可能更智能。
- 更多 API 改进: 某些核心库方法在性能或功能上可能得到优化。
- 虚拟线程: 解决传统线程的性能和资源消耗问题。
1.2. 其他使用感受
内存占用变小
分别使用的JDK 8
、springboot 2.0
对比JDK 21
、springboot 3.0
内存占用情况如下:
对比可以看出JDK 21
比JDK 8
更加节省内存,理论上来说,项目越“臃肿”时差距越明显,可以看出新版本优化还是用心了的