Java 9 到 Java 25:核心新特性全面介绍
❃博主首页 :「程序员1970」 ,同名公众号「程序员1970」
☠博主专栏 :<mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关>
跳过次要版本,聚焦于带来根本性变革的里程碑版本。
Java 9 (2017) - 模块化与函数式流处理的奠基
Java 9 是自 Java 5 以来最重大的更新,其核心是模块化和对函数式编程的深度强化。
- 模块系统 (Project Jigsaw)
- 核心价值:解决“JAR 地狱”问题,提供明确的依赖关系和强大的封装性,允许构建更小、更安全的运行时镜像。
- 影响:为大型企业应用和嵌入式系统提供了可靠的架构基础。
- Stream API 增强
- 核心价值:新增
takeWhile,dropWhile,ofNullable和iterate重载,极大提升了流处理的灵活性和表达能力。
- 核心价值:新增
- 接口私有方法
- 核心价值:允许在接口中定义私有方法(静态或非静态),用于在默认方法之间共享代码,避免代码重复,同时保持 API 的整洁。
实战案例:
publicinterfaceCalculator{defaultintaddAndDouble(int a,int b){returndoubleValue(add(a, b));// 调用私有方法}privateintdoubleValue(int value){// 私有辅助方法return value *2;}privateintadd(int a,int b){// 私有辅助方法return a + b;}}实战案例:
List<Integer> numbers =List.of(1,2,3,4,3,2,1);// takeWhile: 取满足条件的元素直到不满足为止List<Integer> result1 = numbers.stream().takeWhile(n -> n <4).collect(Collectors.toList());// [1, 2, 3]// dropWhile: 跳过满足条件的元素List<Integer> result2 = numbers.stream().dropWhile(n -> n <4).collect(Collectors.toList());// [4, 3, 2, 1]// iterate: 生成无限流(带终止条件)Stream.iterate(0, n -> n <10, n -> n +2).forEach(System.out::println);// 0, 2, 4, 6, 8实战案例:
// module-info.java - 用户服务模块定义moduleuser.service{// 依赖其他模块requiresjava.base;requiresspring.core;// 仅导出API,内部实现对外部不可见exportscom.myapp.user.api;}// 订单服务模块只能访问用户服务导出的APImoduleorder.service{requiresuser.service;// 无法访问user.service的内部实现exportscom.myapp.order.api;}Java 10 (2018) - 类型推断的黎明
- 局部变量类型推断 (
var)- 核心价值:减少代码冗余,提高可读性,尤其是在复杂的泛型类型中。编译器根据右侧表达式自动推断类型。
- 注意:
var是保留类型名,并非关键字,不能用于方法参数、字段或返回类型。
实战案例:
// 传统写法Map<String,List<Employee>> employeesByDepartment =newHashMap<String,List<Employee>>();List<String> names =newArrayList<String>();// var 简洁写法var employeesByDepartment =newHashMap<String,List<Employee>>();var names =newArrayList<String>();// 在复杂泛型中特别有用var complexMap =newConcurrentHashMap<String,Map<Integer,List<ComplexObject>>>();// 在循环和try-with-resources中同样适用try(var reader =newBufferedReader(newFileReader("data.txt"))){// ...}Java 11 (2018, LTS) - 标准化与生产就绪
作为 LTS 版本,Java 11 带来了许多生产级特性。
- 标准化 HTTP Client
- 核心价值:取代老旧的
HttpURLConnection,提供现代、高效、支持 HTTP/2 和异步非阻塞的 API。
- 核心价值:取代老旧的
- 字符串与文件 API 增强
- 核心价值:提供一系列实用方法简化字符串处理和文件操作。
实战案例:
String text =" Hello Java World ";System.out.println(" ".isBlank());// true - 判断是否为空白System.out.println(text.strip());// "Hello Java World" - 去除首尾空白System.out.println("Java".repeat(3));// "JavaJavaJava" - 重复字符串// 按行处理多行字符串String multiLine =""" 第一行 第二行 第三行 """; multiLine.lines().map(String::strip).filter(line ->!line.isEmpty()).forEach(System.out::println);实战案例:
HttpClient client =HttpClient.newHttpClient();HttpRequest request =HttpRequest.newBuilder().uri(URI.create("https://api.example.com/data")).build();// 异步请求 client.sendAsync(request,HttpResponse.BodyHandlers.ofString()).thenApply(HttpResponse::body).thenAccept(System.out::println);Java 17 (2021, LTS) - 语法现代化与模式匹配
Java 17 是另一个 LTS 里程碑,引入了诸多让代码更简洁、安全的特性。
- 密封类 (Sealed Classes)
- 核心价值:精确控制继承层次结构,明确指定哪些子类是允许的。这增强了代码的安全性和可维护性,并为模式匹配奠定了基础。
- 模式匹配增强 (
instanceof和switch)- 核心价值:消除冗余的类型转换和条件判断,使代码更简洁、安全。
- 文本块 (Text Blocks)
- 核心价值:优雅地处理多行字符串,避免繁琐的拼接和转义。
实战案例:
String json =""" { "name": "张三", "age": 28, "hobbies": ["篮球", "编程"] } """;实战案例:
// instanceof 模式匹配if(obj instanceofString s && s.length()>5){// 自动转换并引入变量sSystem.out.println(s.toUpperCase());}// switch 表达式和模式匹配String result =switch(obj){caseInteger i ->"整数: "+ i;caseString s ->"字符串: "+ s;casenull->"空值";// 可以处理nulldefault->"其他类型";};实战案例:
// 只有 Circle, Square, Rectangle 能继承 ShapepublicsealedclassShapepermitsCircle,Square,Rectangle{...}publicfinalclassCircleextendsShape{...}// final: 不可再继承publicfinalclassSquareextendsShape{...}// final: 不可再继承publicnon-sealedclassRectangleextendsShape{...}// non-sealed: 允许其他类继承Java 21 (2023, LTS) - 虚拟线程与结构化并发
Java 21 带来了革命性的并发模型,旨在简化高吞吐量并发应用的编写。
- 虚拟线程 (Virtual Threads)
- 核心价值:极其轻量级的线程,由 JVM 管理而非操作系统。可以轻松创建数百万个虚拟线程,显著提升 I/O 密集型应用的吞吐量,而无需使用复杂的异步编程。
- 结构化并发 (Structured Concurrency)
- 核心价值:将多个相关的并发任务视为一个单一的工作单元,简化错误处理和取消机制,避免任务泄漏。
- 记录模式 (Record Patterns)
- 核心价值:扩展模式匹配,可以直接解构(deconstruct)
record对象,直接提取其组件,极大简化数据处理代码。
- 核心价值:扩展模式匹配,可以直接解构(deconstruct)
实战案例:
recordPoint(int x,int y){}recordLine(Point start,Point end){}// 解构单个recordstaticvoidprintPoint(Object obj){if(obj instanceofPoint(int x,int y)){// 直接提取x, ySystem.out.println("Point: ("+ x +", "+ y +")");}}// 解构嵌套recordstaticStringformat(Object obj){returnswitch(obj){caseLine(Point(int x1,int y1),Point(int x2,int y2))->// 直接提取嵌套组件"Line from ("+ x1 +","+ y1 +") to ("+ x2 +","+ y2 +")";default-> obj.toString();};}实战案例:
try(var scope =newStructuredTaskScope.ShutdownOnFailure()){// 分叉两个子任务Future<String> user = scope.fork(()->fetchUser());Future<Integer> order = scope.fork(()->fetchOrder()); scope.join();// 等待所有任务完成 scope.throwIfFailed();// 如果任一任务失败,抛出异常,并自动取消其他任务// 所有任务成功后组合结果renderPage(user.resultNow(), order.resultNow());}实战案例:
// 创建并启动虚拟线程Thread.startVirtualThread(()->{System.out.println("虚拟线程运行中: "+Thread.currentThread());try{Thread.sleep(Duration.ofSeconds(1));// I/O阻塞时,JVM会自动挂起虚拟线程,释放载体线程}catch(InterruptedException e){...}});// 使用虚拟线程池处理大量任务(生产推荐)try(ExecutorService executor =Executors.newVirtualThreadPerTaskExecutor()){for(int i =0; i <1_000_000; i++){// 轻松处理百万级任务int taskId = i; executor.submit(()->{ log.info("处理任务 {}, 线程: {}", taskId,Thread.currentThread());});}}// 自动关闭Java 24 (2025) - AI、性能与安全的前沿
Java 24 聚焦于为 AI 时代做准备,并大幅提升性能和安全性。
- 原始类型模式匹配 (Primitive Types in Patterns)
- 核心价值:允许
instanceof和switch直接匹配原始类型(如int,double),消除不必要的装箱开销,代码更简洁高效。
- 核心价值:允许
- 结构化并发与虚拟线程解绑 (Virtual Thread Unpinning)
- 核心价值:虚拟线程在进入
synchronized块时不再被“钉住”(pinned),即使发生阻塞,JVM 也能挂起虚拟线程并释放底层载体线程,进一步提升了虚拟线程在同步代码中的并发性能。 - 影响:使得传统使用
synchronized的代码也能享受到虚拟线程的扩展性优势。
- 核心价值:虚拟线程在进入
- Stream Gatherers
- 核心价值:允许在 Stream 流中创建自定义的、有状态的中间操作,极大地增强了流处理的灵活性和表达能力。
- 抗量子加密 (Post-Quantum Cryptography)
- 核心价值:引入基于格理论的抗量子攻击加密算法(ML-KEM, ML-DSA),为未来量子计算时代的安全通信提供保障。
- 影响:金融、政务等对长期数据安全敏感的领域需要开始关注和迁移。
实战案例:
// 将流按固定大小(3个元素)分窗Stream<List<Integer>> result =Stream.of(1,2,3,4,5,6).gather(Gatherers.windowFixed(3)); result.forEach(System.out::println);// 输出: [1,2,3], [4,5,6]实战案例:
staticvoidhandlePrimitive(Object obj){if(obj instanceofint i){// 直接匹配int,自动拆箱System.out.println("整数: "+ i);}elseif(obj instanceofdouble d){// 直接匹配doubleSystem.out.println("小数: "+ d);}}Java 25 (2025, LTS) - 简化与效率
作为最新的 LTS 版本,Java 25 专注于提升开发效率和运行时性能。
- 模块导入声明 (Module Import Declarations)
- 核心价值:允许一次性导入整个模块的所有包,极大简化了代码,尤其适合脚本编写和快速原型开发。
- 简化的 Main 方法 (Simple Source Files and Instance Main Methods)
- 核心价值:大幅降低入门门槛。现在可以直接在类中编写
void main()方法,无需public static修饰符和String[] args参数,JVM 会自动处理。
- 核心价值:大幅降低入门门槛。现在可以直接在类中编写
- 更自然的构造函数 (Flexible Constructor Bodies)
- 核心价值:允许在构造函数中调用父类构造方法 (
super()) 之前执行逻辑(如参数校验),使代码更自然、安全。
- 核心价值:允许在构造函数中调用父类构造方法 (
实战案例:
classManextendsPerson{Man(int age){if(age <0) age =18;// 在super()前进行校验super(age);}}实战案例:
// HelloWorld.javavoidmain(){System.out.println("Hello, Java 25!");}实战案例:
importmodulejava.base;// 导入java.base模块的所有包voidmain(){// 结合简化的main方法var list =List.of("Java","25");System.out.println(list);}展望一下
从 Java 9 到 Java 25,Java 平台的演进呈现出清晰的脉络:
- 架构现代化:从模块化(Jigsaw)开始,构建更可靠、可维护的系统架构。
- 语法革命:通过
var、文本块、密封类、记录类、模式匹配等特性,持续减少样板代码,提升开发效率和代码可读性。 - 并发模型革新:虚拟线程和结构化并发彻底改变了 Java 高并发编程的范式,使编写高吞吐量应用变得前所未有的简单。
- 性能持续优化:从 G1、ZGC、Shenandoah 等低延迟垃圾收集器,到紧凑对象头、向量 API 等,JVM 性能不断突破极限。
建议:
优先采用 LTS 版本(Java 11, 17, 21, 25) 以获得长期支持和稳定性。Java 8 已显老旧,应制定迁移计划。
关注公众号获取更多技术干货 !