Java从Java 8的函数式编程革命,到Java 24的轻量化与标准化双重进化,历经16年的现代化转型。本文全面梳理Java 8至Java 24各版本的关键特性,深入分析技术演进脉络,并链接到系列详细文章,为开发者提供完整的Java版本升级指南。
Java版本演进概览 版本发布时间线
版本
发布日期
类型
主要改进领域
Java 8
2014 年 3 月
LTS
Lambda、Stream API、默认方法等
Java 9
2017 年 9 月
非 LTS
模块化系统、接口私有方法等
Java 10
2018 年 3 月
非 LTS
var 关键字、集合工厂方法等
Java 11
2018 年 9 月
LTS
HTTP Client、ZGC 等
Java 12
2019 年 3 月
非 LTS
Switch 表达式(预览)、Shenandoah GC
Java 13
2019 年 9 月
非 LTS
文本块(Text Blocks)预览
Java 14
2020 年 3 月
非 LTS
Records、模式匹配(Pattern Matching)
Java 15
2020 年 9 月
非 LTS
Text Blocks 正式发布、ZGC 转正
Java 16
2021 年 3 月
非 LTS
Records 正式发布、Vector API 孵化
Java 17
2021 年 9 月
LTS
Sealed Classes、强封装内部 API
Java 18
2022 年 3 月
非 LTS
UTF-8 默认编码、jwebserver
Java 19
2022 年 9 月
非 LTS
Virtual Threads(预览)
Java 20
2023 年 3 月
非 LTS
Structured Concurrency(孵化)
Java 21
2023 年 9 月
LTS
Virtual Threads 正式发布、Sequenced Collections
Java 22
2024 年 3 月
非 LTS
多文件源码运行、构造函数前语句支持
Java 23
2024 年 9 月
非 LTS
原始类型模式匹配(预览)
Java 24
2025 年 3 月
非 LTS
KDF API、类加载缓存、Stream Gatherer 正式发布
语言与语法增强全景 函数式编程的奠基:Java 8 Java 8作为现代Java的起点,带来了革命性的函数式编程特性:
核心特性详解
Lambda表达式 :简化匿名函数书写
函数式接口 :Predicate、Function、Consumer等
方法引用 :Class::method语法
Stream API :声明式数据处理
Optional类 :优雅处理空值
实际应用示例 1 2 3 4 5 6 7 8 9 10 11 12 13 List<String> names = Arrays.asList("Alice" , "Bob" , "Charlie" ); List<String> filteredNames = names.stream() .filter(name -> name.startsWith("A" )) .map(String::toUpperCase) .collect(Collectors.toList()); public Optional<User> findUser (String id) { return users.stream() .filter(user -> user.getId().equals(id)) .findFirst(); }
更多Java 8特性详见:Java8新特性深度解析:Lambda表达式到并行流
模块化系统的诞生:Java 9 Java 9通过Project Jigsaw实现了Java平台的模块化:
核心特性详解
模块化系统 :jigsaw项目重构JDK
JShell :交互式REPL工具
集合工厂方法 :List.of()、Set.of()等
私有接口方法 :接口中可定义私有方法
响应式流API :Flow类支持背压
模块声明示例 1 2 3 4 5 6 7 8 module com.example.app { requires java.base; requires com.fasterxml.jackson.databind; exports com.example.api; opens com.example.model to com.fasterxml.jackson.databind; }
局部变量推断:Java 10 Java 10引入的var关键字简化了局部变量声明:
1 2 3 4 5 6 7 8 ArrayList<String> list = new ArrayList <String>(); HashMap<String, Integer> map = new HashMap <String, Integer>(); var list = new ArrayList <String>();var map = new HashMap <String, Integer>();var stream = list.stream();
HTTP客户端与字符串增强:Java 11 Java 11作为LTS版本,带来了实用的标准库增强:
核心特性详解
标准HTTP客户端 :替代HttpURLConnection
字符串API增强 :isBlank()、lines()、strip()等
单文件运行 :java Hello.java
ZGC正式发布 :可伸缩低延迟垃圾收集器
HTTP客户端使用示例 1 2 3 4 5 6 7 8 9 10 HttpClient client = HttpClient.newHttpClient();HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.example.com/users" )) .GET() .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body());
Switch表达式与预览特性:Java 12-13 Java 12-13主要关注预览特性的引入:
Switch表达式(Java 12) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 int days = switch (day) { case MONDAY, FRIDAY, SUNDAY -> 6 ; case TUESDAY -> 7 ; case THURSDAY, SATURDAY -> 8 ; case WEDNESDAY -> 9 ; }; String json = """ { "name": "Alice", "age": 30, "city": "Beijing" } """ ;
Records与模式匹配:Java 14-16 Java 14-16完善了数据类和模式匹配:
Records类(Java 14) 1 2 3 4 5 public record Person (String name, int age) {}var person = new Person ("Alice" , 30 );System.out.println(person.name());
instanceof模式匹配(Java 14) 1 2 3 4 5 6 7 8 9 if (obj instanceof String s) { System.out.println(s.toUpperCase()); } if (obj instanceof String s) { System.out.println(s.toUpperCase()); }
密封类与强封装:Java 15-17 Java 15-17完善了类型系统和内部API封装:
密封类(Java 15) 1 2 3 4 5 6 7 8 public sealed class Shape permits Circle, Rectangle, Triangle { } public final class Circle extends Shape { private final double radius; }
更多Java 17特性详见:Java17新特性深度解析:LTS版本的现代化革新
默认UTF-8与简单Web服务器:Java 18 Java 18带来了平台层面的实用改进:
1 2 3 4 5 6 7 8 String content = Files.readString(path); SimpleWebServer server = SimpleWebServer.create();server.start(8080 );
虚拟线程的诞生:Java 19-20 Java 19-20引入了Project Loom的核心特性:
虚拟线程(Java 19预览) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Thread virtualThread = Thread.ofVirtual() .name("worker-" ) .start(() -> { System.out.println("Running in virtual thread: " + Thread.currentThread()); }); try (var scope = new StructuredTaskScope .ShutdownOnFailure()) { var task1 = scope.fork(this ::task1); var task2 = scope.fork(this ::task2); scope.join(); return combine(task1.get(), task2.get()); }
虚拟线程正式发布:Java 21 Java 21作为LTS版本,正式发布了虚拟线程:
核心特性详解
虚拟线程正式发布 :支持数百万并发任务
字符串模板预览 :类型安全的字符串插值
记录模式正式 :解构记录类的模式匹配
Sequenced Collections :有序集合接口
分代ZGC :改进的垃圾收集器
虚拟线程示例 1 2 3 4 5 6 7 8 9 10 11 12 13 ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();executor.submit(() -> { processRequest(); }); Thread.ofVirtual().start(() -> { System.out.println("Virtual thread: " + Thread.currentThread()); });
更多Java 21特性详见:Java21新特性深度解析:现代化编程的里程碑
字符串模板标准化:Java 22 Java 22将字符串模板从预览转为正式特性:
字符串模板使用 1 2 3 4 5 6 7 8 9 10 11 12 String greeting = STR."Hello, \{name}! You are \{age} years old." ;String formatted = FMT."Name: %-10s Age: %3d\{name, age}" ;String sql = SQL.""" SELECT * FROM users WHERE name = '\{name}' AND age >= \{minAge} """ ;
原始类型模式匹配:Java 23 Java 23引入了原始类型模式匹配:
1 2 3 4 5 6 7 8 9 10 11 public void processValue (Object obj) { switch (obj) { case Integer i when i > 100 -> System.out.println("Big integer: " + i); case Integer i -> System.out.println("Integer: " + i); case Double d when d < 0 -> System.out.println("Negative double: " + d); case Double d -> System.out.println("Double: " + d); case String s -> System.out.println("String: " + s); default -> System.out.println("Other type" ); } }
更多Java 23特性详见:Java23新特性深度解析:模块化与性能的完美融合
轻量化与标准化:Java 24 Java 24作为非LTS版本,带来了轻量化特性和标准化:
简单Web服务器 1 2 3 4 SimpleWebServer server = SimpleWebServer.create();server.route("/api/hello" , (req, resp) -> "Hello, Java 24!" ); server.start(8080 );
键值对类型 1 2 3 KeyValuePair<String, Integer> score = KeyValuePair.of("Alice" , 95 ); System.out.println(score.key() + ": " + score.value());
更多Java 24特性详见:Java24新特性深度解析:轻量化与标准化的双重进化
并发与虚拟线程演进 传统线程模型的挑战 在Java 21之前,高并发编程面临以下问题:
线程创建成本高 :每个线程需要1MB栈空间
上下文切换开销大 :线程调度消耗CPU资源
资源利用率低 :大量线程处于等待状态
Project Loom的解决方案 虚拟线程的核心优势 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public void handleRequestTraditional () { new Thread (() -> { String data = readFromDatabase(); processData(data); }).start(); } public void handleRequestVirtual () { Thread.ofVirtual().start(() -> { String data = readFromDatabase(); processData(data); }); }
结构化并发 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 public Response handleRequest (Request req) throws ExecutionException, InterruptedException { try (var scope = new StructuredTaskScope .ShutdownOnFailure()) { var authTask = scope.fork(() -> authenticate(req)); var validateTask = scope.fork(() -> validate(req)); var enrichTask = scope.fork(() -> enrich(req)); scope.join(); return new Response ( authTask.get(), validateTask.get(), enrichTask.get() ); } }
虚拟线程的最佳实践 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ExecutorService virtualExecutor = Executors.newVirtualThreadPerTaskExecutor();private static final ThreadLocal<String> USER_CONTEXT = new ThreadLocal <>();private static final ScopedValue<String> USER_CONTEXT = ScopedValue.newInstance();public void processRequest () { ScopedValue.where(USER_CONTEXT, "user123" ) .run(() -> { String user = USER_CONTEXT.get(); performBusinessLogic(user); }); } public synchronized void synchronizedMethod () { }
JVM与性能优化全景 垃圾收集器演进 G1 GC (Java 9默认) 1 2 3 4 5 6 java -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1HeapRegionSize=16m -Xmx8g MyApp
ZGC (Java 11实验,15正式,21分代) 1 2 3 4 5 java -XX:+UseZGC -XX:+ZGenerational -Xmx16g MyApp
Shenandoah GC (Java 12+) 1 2 3 4 java -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=adaptive MyApp
Vector API的性能提升 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public void scalarComputation (float [] a, float [] b, float [] result) { for (int i = 0 ; i < a.length; i++) { result[i] = a[i] * b[i] + 1.0f ; } } public void vectorComputation (float [] a, float [] b, float [] result) { VectorSpecies<Float> species = FloatVector.SPECIES_PREFERRED; for (int i = 0 ; i < a.length; i += species.length()) { FloatVector va = FloatVector.fromArray(species, a, i); FloatVector vb = FloatVector.fromArray(species, b, i); FloatVector vc = va.mul(vb).add(1.0f ); vc.intoArray(result, i); } }
外部函数和内存API 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class NativeLibrary { public static void main (String[] args) throws Throwable { FunctionDescriptor sqrtDescriptor = FunctionDescriptor.of( ValueLayout.JAVA_DOUBLE, ValueLayout.JAVA_DOUBLE ); Linker linker = Linker.nativeLinker(); SymbolLookup lookup = linker.defaultLookup(); MethodHandle sqrt = linker.downcallHandle( lookup.find("sqrt" ).orElseThrow(), sqrtDescriptor ); double result = (double ) sqrt.invokeExact(16.0 ); System.out.println("sqrt(16.0) = " + result); } }
核心库增强总览 集合框架演进 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 List<String> result = names.stream() .filter(s -> s.length() > 3 ) .map(String::toUpperCase) .collect(Collectors.toList()); List<String> immutable = List.of("A" , "B" , "C" ); Set<String> immutableSet = Set.of("X" , "Y" , "Z" ); Map<String, Integer> immutableMap = Map.of("key1" , 1 , "key2" , 2 ); Deque<String> deque = new ArrayDeque <>(); deque.addFirst("first" ); deque.addLast("last" ); String first = deque.getFirst();String last = deque.getLast();KeyValuePair<String, Integer> pair = KeyValuePair.of("score" , 95 );
HTTP客户端演进 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 URL url = new URL ("https://api.example.com" );HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET" ); try (BufferedReader reader = new BufferedReader ( new InputStreamReader (conn.getInputStream()))) { String response = reader.lines().collect(Collectors.joining()); } HttpClient client = HttpClient.newHttpClient();HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.example.com" )) .GET() .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); String body = response.body();
时间日期API改进 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 LocalDate today = LocalDate.now();LocalTime now = LocalTime.now();LocalDateTime dateTime = LocalDateTime.of(today, now);ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Asia/Shanghai" ));String formatted = zdt.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);LocalDate parsed = LocalDate.parse("2024-01-15" );LocalTime time = LocalTime.parse("14:30:45" );RandomGenerator random = RandomGenerator.of("L128X1024MixRandom" );int randomInt = random.nextInt(100 );
工具链与生态完善 开发工具演进 JShell (Java 9) 1 2 3 4 5 6 7 8 9 10 11 $ jshell jshell> int x = 42 x ==> 42 jshell> System.out.println("Hello, " + x) Hello, 42 jshell> /exit
jlink (Java 9) 1 2 3 4 5 6 7 $ jlink --module-path $JAVA_HOME /jmods \ --add-modules java.base,java.sql \ --output myruntime $ myruntime/bin/java -cp app.jar com.example.Main
jpackage (Java 16) 1 2 3 4 5 $ jpackage --input target/ \ --main-class com.example.Main \ --name MyApp \ --type dmg
构建工具集成 Maven配置示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <properties > <maven.compiler.source > 21</maven.compiler.source > <maven.compiler.target > 21</maven.compiler.target > <maven.compiler.release > 21</maven.compiler.release > </properties > <dependencies > <dependency > <groupId > org.projectlombok</groupId > <artifactId > lombok</artifactId > <version > 1.18.30</version > </dependency > </dependencies >
Gradle配置示例 1 2 3 4 5 6 7 8 9 10 11 java { sourceCompatibility = JavaVersion.VERSION_21 targetCompatibility = JavaVersion.VERSION_21 } tasks.withType(JavaCompile).configureEach { options .compilerArgs.addAll([ '--enable-preview' , '--add-modules' , 'jdk.incubator.concurrent' ]) }
版本升级策略与最佳实践 LTS版本选择指南
LTS版本
发布年份
维护周期
推荐使用场景
Java 8
2014
延长支持至2030
遗留系统,企业级应用
Java 11
2018
延长支持至2032
云原生应用,容器化部署
Java 17
2021
长期支持至2029
新项目,企业级开发
Java 21
2023
长期支持至2031
现代化应用,高并发系统
渐进式升级路径 第一阶段:评估当前环境 1 2 3 4 5 6 7 8 java -version jdeps --multi-release base --class-path libs/*.jar javac -Xlint:all --release 17 src/**/*.java
第二阶段:准备升级 1 2 3 4 5 6 7 8 9 10 11 12 13 14 javac --enable-preview --release 21 src
第三阶段:特性采用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public record User (String name, String email, LocalDate birthDate) {}String sql = """ SELECT u.name, u.email, p.title FROM users u JOIN posts p ON u.id = p.user_id WHERE u.created_at > ? ORDER BY u.name """ ;ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();executor.submit(() -> handleRequest(request));
性能调优实践 JVM参数配置 1 2 3 4 5 6 7 8 java -XX:+UseZGC \ -XX:+ZGenerational \ -XX:MaxGCPauseMillis=100 \ -Xmx8g \ -Xms4g \ --enable-preview \ -jar app.jar
虚拟线程调优 1 2 3 4 5 6 7 8 9 10 11 12 13 ThreadFactory factory = Thread.ofVirtual() .name("worker-" , 0 ) .factory(); ExecutorService executor = Executors.newThreadPerTaskExecutor(factory);ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();long virtualThreadCount = Thread.getAllStackTraces().keySet() .stream() .filter(Thread::isVirtual) .count();
总结与展望 Java版本演进成果
方向
演进成果
语言现代化
从命令式编程到函数式编程,支持模式匹配、记录类、密封类等现代语法特性
并发模型升级
虚拟线程革命性改变并发编程,支持数百万并发任务,结构化并发简化错误处理
性能优化
ZGC、Shenandoah等低延迟GC,Vector API利用SIMD指令,外部函数API提升系统集成能力
标准库扩展
Stream API、Optional、HttpClient、Sequenced Collections等增强开发者体验
安全性增强
UTF-8默认编码、EdDSA算法、KDF API等提供现代安全保障
工具链完善
JShell、jlink、jpackage、JMH等工具助力开发调试与部署
技术发展趋势 1. 轻量化与易用性
简单Web服务器降低原型开发门槛
键值对类型简化数据操作
单文件运行提升脚本编写体验
2. 标准化进程
预览特性逐步正式化(如字符串模板、原始类型模式匹配)
API稳定性增强,减少版本迁移成本
工具和框架的广泛支持
3. 性能与并发
虚拟线程成为高并发编程的标准解决方案
SIMD优化和外部函数调用提升计算性能
结构化并发提供更好的资源管理和错误处理
4. 现代化生态
模块化系统完善依赖管理
容器化部署的最佳实践
云原生应用的原生支持
未来展望 Java 25(预计2025年9月发布)作为下一个LTS版本,将会:
进一步完善虚拟线程生态
标准化更多预览特性
增强AI和机器学习支持
提升容器化和云原生能力
学习建议 初学者路线
Java 8 → 11 :掌握基础语法、Lambda、Stream、Optional、HTTP Client
Java 17 :学习Record、Sealed Class、Pattern Matching、现代时间API
Java 21 :深入虚拟线程、结构化并发、Sequenced Collections
中级开发者
重点学习Project Loom(虚拟线程、结构化并发)
掌握Vector API和外部函数API的高性能编程
理解模块化系统的设计理念
架构师与高级开发者
关注JVM演进和GC优化策略
研究并发模型的设计模式
把握Java在云原生时代的定位
Java的现代化转型是一场持久战,从Java 8的函数式编程奠基,到Java 24的轻量化创新,每一个版本都在推动Java语言向更现代化、更高效的方向发展。选择合适的Java版本,及时跟进行业最佳实践,将帮助开发者在快速变化的技术环境中保持竞争力。
系列文章导航 本文是Java版本演进系列的总结篇,更多详细内容请参考:
参考资料
OpenJDK官方文档
Oracle Java文档
JetBrains Java版本兼容性指南
Spring Boot版本兼容性
State of Java Survey报告