JDK17先进特性
JDK 17 是 Java LTS(长期支持)版本,相比 JDK 8 和 11,引入了大量能提升日常开发效率、代码可读性、可维护性和运行性能的“现代化特性”。
下面从 语法增强、性能提升、JVM特性 三个角度,做个简单的介绍。
一、语法层面的生产力提升
1. 增强的 switch
表达式
传统 switch
:
String result;
switch (day) {case MONDAY:case FRIDAY:result = "Work";break;case SATURDAY:case SUNDAY:result = "Rest";break;default:result = "Unknown";
}
增强版 switch
表达式:
String result = switch (day) {case MONDAY, FRIDAY -> "Work";case SATURDAY, SUNDAY -> "Rest";default -> "Unknown";
};
public String getOrderStatusText(int status) {return switch (status) {case 0 -> "待支付";case 1 -> "待发货";case 2 -> "已发货";case 3 -> "已完成";default -> "未知状态";};
}
优势:
更简洁、无
break
误用风险;可以直接返回值;
支持箭头语法,阅读性高。
2. 文本块(Text Blocks)
简化多行字符串拼接。
旧写法:
String json = "{\n" +" \"name\": \"Daniel\",\n" +" \"age\": 25\n" +"}";
新写法:
// 多行字符串处理变得非常简单
String json = """{"name": "Jimy","age": 30,"email": "Jimy@example.com","address": {"city": "北京","street": "朝阳区"}}""";String sql = """SELECT u.id, u.name, u.emailFROM users uINNER JOIN orders o ON u.id = o.user_idWHERE o.created_date > ?ORDER BY u.name ASC""";// HTML 模板
String html = """<!DOCTYPE html><html><head><title>用户页面</title></head><body><h1>欢迎, %s</h1></body></html>""".formatted(userName);
优势:
代码整洁;
无需转义;
非常适合 JSON、SQL、HTML 模板。
3. instanceof
模式匹配
简化类型判断与强制转换。
旧写法:
if (obj instanceof String) {String s = (String) obj;System.out.println(s.toLowerCase());
}
新写法:
// JDK 17 新方式 - 自动类型转换
if (obj instanceof String s) {System.out.println(s.length()); // 直接使用 s,无需强制转换
}// 在条件中直接使用
if (obj instanceof String s && s.length() > 5) {System.out.println("长字符串: " + s);
}
优势:
避免重复强制类型转换;
模式变量自动作用域安全。
4. record
类型
一行搞定 DTO / VO。
public record UserVo(String name, int age) {}
自动生成:
构造方法;
getters
;equals
、hashCode
、toString
。
使用场景:
纯数据类(DTO、VO、配置载体);
日志数据、事件对象。
5. 密封类(Sealed Classes)
public sealed abstract class Message permits TextMessage, ImageMessage {}public final class TextMessage extends Message {private final String content;public TextMessage(String content) { this.content = content; }
}public final class ImageMessage extends Message {private final String url;public ImageMessage(String url) { this.url = url; }
}
用途:
用于复杂业务模型(如订单状态、消息类型),限制扩展来源。
优势:
防止随意扩展;
有助于 switch 模式匹配(未来版本中更强大);
提高领域模型的约束性。
二、JVM 和运行效率的提升
1. 更快的启动与内存占用
ZGC 和 Shenandoah GC 都在 JDK 17 中成熟,极大降低延迟。
对服务端应用、微服务容器(如 Spring Boot + Docker)非常友好。
即便是较大项目,也能快速启动且无明显停顿。
ZGC 用途:
减少 Full GC 停顿,提升服务稳定性。
用法:JVM 启动参数
java -XX:+UseZGC -Xmx512m -Xms512m -jar app.jar
优势:
极低延迟(<10ms 停顿);
非常适合 Spring Cloud / 微服务;
支持自动内存收缩。
2. JIT 改进 & 新字节码优化
HotSpot 中的 C2 编译器经过优化;
支持
JEP 376: Hidden Classes
→ 框架如 Spring / Hibernate 动态代理更高效;JEP 387: Elastic Metaspace
→ 元空间自动收缩,节约内存。
3. 跨平台部署更一致
JDK 17 支持更稳定的 container-awareness;
自动识别 Docker 的 CPU / 内存限制;
适合现代微服务架构。
三、开发体验改进
1. 新的随机数 API,更方便生成高质量随机值
// 新的随机数API,更清晰、更强大
import java.util.random.*;// 使用明确的算法
RandomGenerator generator = RandomGenerator.of("L64X128MixRandom");// 生成流
double randomNumbers = generator.doubles(100, 0, 1).average().orElse(0);// 不同的算法适用于不同场景
RandomGenerator fastGenerator = RandomGenerator.of("Xoshiro256PlusPlus");
RandomGenerator secureGenerator = RandomGenerator.getDefault(); // 安全随机数
用途:
生成安全或分布良好的随机数(比如邀请码、验证码)。
2. 简化的 HttpClient
在 JDK 11 引入,在 JDK 17 已非常成熟:
HttpClient client = HttpClient.newHttpClient();HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://api.example.com/data")).header("Authorization", "Bearer " + token).build();HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());log.info("Response: {}", response.body());
优势:
支持同步/异步;
内置于 JDK;
线程安全、轻量。
3. 新的命令行工具增强
jpackage
: 生成可执行安装包;jdeps
,jlink
: 分析依赖、打包最小运行镜像;jshell
: 可交互运行 Java 代码片段(非常适合试验逻辑)。
jshell用法:
有了jshell,可以不用启动IDEA,Eclipse等开发工具,在里边写 main 方法,直接在命令行使用jshell试逻辑。