前言
Java 目前主流长期支持(LTS)版本为 JDK8、JDK11、JDK17、JDK21 ,从企业现状来看:JDK8 仍是存量主力,JDK17 是当下最佳升级版本,JDK21 代表未来高并发方向。很多开发同学对各版本新增特性、适用场景、升级收益一知半解,本文用表格横向对比 + 特性详解 + 实战代码 + 生产选型,讲下4个LTS版本差异,可直接用于面试复盘、项目版本选型、技术分享。
一、JDK8/JDK11/JDK17/JDK21 核心新特性极简对比表
| 版本 | 发布 | 定位 | 核心标志性特性 | GC重点 | 适用场景 |
|---|---|---|---|---|---|
| JDK8 | 2014 LTS | 函数式编程里程碑 | Lambda、Stream、Optional、新时间API、CompletableFuture、接口默认方法 | G1为主,ZGC/Shenandoah无 | 老项目存量、传统单体/微服务、兼容性优先 |
| JDK11 | 2018 LTS | 模块化+精简优化 | var局部变量推断、标准化HttpClient、模块化JPMS、字符串增强、ZGC预览 | G1,ZGC/Shenandoah预览 | 过渡升级、云原生轻量化项目、网络调用场景 |
| JDK17 | 2021 LTS | 现代化语法+稳定低延迟GC | Record、密封类Sealed、instanceof模式匹配、文本块Text Blocks、Switch表达式、ZGC稳定 | ZGC/Shenandoah正式稳定 | 新项目首选、中间件开发、低延迟业务、主流升级目标 |
| JDK21 | 2023 LTS | 高并发革命+开发效率 | 虚拟线程Virtual Threads、结构化并发、字符串模板、Switch模式匹配增强、Stream Gatherers | ZGC持续优化,虚拟线程适配 | IO密集型高并发、网关/消息消费、百万级并发服务、未来长期项目 |
二、各版本核心特性详解 + 实战代码 + 生产应用场景
1. JDK8(必学,企业最通用)
核心定位:Java语法革命,函数式编程落地,至今不可替代
-
Lambda + 函数式接口
-
作用:简化匿名内部类,行为参数化
-
应用:集合排序、线程、回调、流式处理
-
代码示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); ``names.sort((a, b) -> a.compareTo(b)); ``// 方法引用进一步简化 ``names.sort(String::compareTo);
-
-
Stream API
-
作用:集合流式处理,过滤/映射/分组/统计,替代for循环
-
应用:业务数据清洗、分页统计、多条件筛选
-
代码示例:
List<Employee> employees = getEmployees(); ``// 链式操作:过滤高薪员工、提取姓名、收集为列表 ``List<String> highEarnerNames = employees.stream() `` .filter(emp -> emp.getSalary() > 50000) `` .map(Employee::getName) `` .collect(Collectors.toList());
-
-
Optional
-
作用:杜绝空指针NPE,链式判空
-
应用:接口返回值、多层对象取值
-
代码示例:
// 链式安全访问,避免多层if-null ``String city = Optional.ofNullable(user) `` .map(User::getAddress) `` .map(Address::getCity) `` .orElse("Unknown");
-
-
java.time 新时间类
-
作用:替代Date/Calendar,线程安全
-
应用:日期格式化、时间差计算、时区处理
-
-
CompletableFuture
-
作用:异步链式调用,非阻塞
-
应用:多接口并行调用、异步任务编排
-
2. JDK11(过渡LTS,轻量升级)
-
var 局部变量类型推断
-
作用:简化复杂泛型变量声明,仅局部变量可用
-
应用:Map、List、try-with-resources
-
代码示例:
// 简化复杂泛型声明 ``var deptEmployees = new HashMap<String, List<Employee>>(); ``// try-with-resources简化 ``try (var inputStream = new FileInputStream("data.txt")) { `` // 读取文件内容 ``}
-
-
标准化 HttpClient
-
作用:原生支持HTTP/2、异步、WebSocket,不用依赖OkHttp/HttpClient
-
应用:微服务调用、第三方接口请求
-
代码示例:
// 同步GET请求 ``HttpClient client = HttpClient.newHttpClient(); ``HttpRequest request = HttpRequest.newBuilder() `` .uri(URI.create("https://api.example.com/users")) `` .build(); ``HttpResponse<String> response = client.send( `` request, HttpResponse.BodyHandlers.ofString() ``);
-
-
字符串增强:strip/isBlank/lines/repeat
-
作用:解决trim不处理全角空格等问题
-
应用:参数校验、文本处理
-
-
JPMS模块化
-
作用:强封装、依赖管控,解决类冲突
-
应用:大型框架、SDK开发
-
代码示例(module-info.java):
module com.example.myapp { `` requires java.base; `` requires java.net.http; `` exports com.example.myapp.service; ``}
-
3. JDK17(当前生产最佳LTS,强烈推荐升级)
-
Record 数据类
-
作用:一行代码生成不可变DTO,自动getter/equals/hashCode/toString
-
应用:VO、DTO、接口入参出参、流式中间对象
-
代码示例:
// 一行搞定DTO,无需手动编写样板方法 ``public record UserDTO(Long id, String name, String email) {}
-
-
密封类 Sealed Class
-
作用:限制类继承范围,防止继承滥用,API安全管控
-
应用:枚举扩展、领域模型、框架API设计
-
代码示例:
// 仅允许Car和Truck继承 ``public sealed class Vehicle permits Car, Truck { `` private final String brand; `` public Vehicle(String brand) { this.brand = brand; } ``} ``// 子类必须是final、sealed或non-sealed ``public final class Car extends Vehicle { `` public Car(String brand) { super(brand); } ``}
-
-
instanceof 模式匹配
-
作用:判断类型同时自动强转,省去手动强转
-
应用:多类型分支判断、多态处理
-
代码示例:
Object obj = "Hello World"; ``// 自动类型转换,无需手动强转 ``if (obj instanceof String str) { `` System.out.println(str.toUpperCase()); ``} else if (obj instanceof Integer num) { `` System.out.println(num * 2); ``}
-
-
文本块 Text Blocks
-
作用:多行字符串不用转义引号、换行,SQL/JSON更清爽
-
应用:SQL语句、JSON模板、HTML片段
-
代码示例:
// 多行SQL,无需转义换行和引号 ``String sql = """ `` SELECT id, name, email `` FROM users `` WHERE department = 'IT' `` AND salary > 50000 `` ORDER BY create_time DESC `` """; ``}
-
-
Switch表达式增强
-
作用:支持返回值、多case合并、yield,替代if-else
-
应用:复杂业务分支、状态机
-
4. JDK21(未来LTS,高并发天花板)
-
虚拟线程 Virtual Threads(重磅)
-
作用:用户态线程,轻量百万级并发,无操作系统线程开销
-
应用:IO密集型服务、网关、消息队列消费、接口并发
-
代码示例:
// 百万级虚拟线程并发,无性能压力 ``for (int i = 0; i < 1_000_000; i++) { `` Thread.startVirtualThread(() -> { `` try { `` Thread.sleep(1000); // 模拟IO操作 `` System.out.println("Virtual thread: " + Thread.currentThread().threadId()); `` } catch (InterruptedException e) { `` e.printStackTrace(); `` } `` }); ``}
-
-
结构化并发
-
作用:统一管理子任务生命周期,失败自动取消,无线程泄露
-
应用:多接口聚合查询、批量异步任务
-
代码示例:
// 统一管理子任务,失败自动取消其他任务 ``try (var scope = new StructuredTaskScope.ShutdownOnFailure()) { `` Future<String> userFuture = scope.fork(() -> fetchUser()); `` Future<Integer> orderFuture = scope.fork(() -> fetchOrder()); `` `` scope.join(); // 等待所有任务完成 `` scope.throwIfFailed(); // 有任务失败则抛出异常 `` `` String user = userFuture.resultNow(); `` Integer order = orderFuture.resultNow(); ``}
-
-
字符串模板 STR
-
作用:直接嵌入变量表达式,替代String.format和拼接
-
应用:动态SQL、日志、JSON拼接
-
代码示例:
String name = "Alice"; ``int age = 25; ``// 嵌入式表达式,简洁直观 ``String userInfo = STR."Name: \{name}, Age: \{age}"; ``// 多行模板+表达式组合 ``String sql = STR.""" `` SELECT id, name FROM users `` WHERE department = '\{dept}' AND salary > \{minSalary} `` """; ``}
-
-
Stream Gatherers
-
作用:扩展流式操作,实现复杂分组、滑动窗口
-
应用:大数据流式处理、实时统计
-
三、生产环境版本选型建议
-
老项目维护、兼容优先 → JDK8
- 生态最全,框架支持度最高,迁移成本高的存量项目不建议动。
-
轻量化改造、云原生、不想激进 → JDK11
- 体积更小,启动更快,适合容器化部署,作为过渡版本。
-
新项目开发、中间件、低延迟系统、主流升级 → JDK17
- 语法现代化、GC稳定、生态成熟,SpringBoot3、主流框架标配,性价比最高。
-
IO密集高并发、百万级吞吐、未来长期项目 → JDK21
- 虚拟线程解决并发瓶颈,适合网关、消息消费、高吞吐服务,未来主流。
四、总结
本文重点讲解了Java四大主流LTS版本(JDK8、JDK11、JDK17、JDK21)的核心特性与应用场景,同时需明确:Java版本分为长期支持版(LTS)和短期过渡版(非LTS,如JDK9、JDK10、JDK12-JDK16、JDK18-JDK20等),过渡版本仅作为特性迭代的中间产物,无长期维护支持,存在安全漏洞、生态适配不足等问题,生产环境绝对不建议使用,仅适合个人学习新特性、技术预研。
-
JDK8:基础必学,存量主力,目前仍是国内企业存量项目的主流版本,生态最完善、兼容性最强,无需强制迁移,适合老项目维护。
-
JDK11:轻量化过渡,云原生友好,作为JDK8到JDK17的过渡LTS版本,体积小、启动快,适合需要轻量化改造、容器化部署的项目,不建议作为新项目长期选型。
-
JDK17:当前最优生产LTS,语法现代化、低延迟GC稳定,适配SpringBoot3等主流框架,兼顾兼容性与新特性,是新项目开发、老项目升级的首选。
-
JDK21:高并发新范式,必学,虚拟线程、结构化并发等特性彻底解决高并发瓶颈,代表Java未来发展方向,适合IO密集型高并发项目、未来长期规划项目。
-
过渡版本(JDK9、JDK10、JDK12-JDK16、JDK18-JDK20等):不建议生产使用,无长期维护,特性未经过充分验证,生态支持不完善,仅用于学习新特性、技术预研。