Java 作为企业级开发的主流语言,其版本迭代始终围绕着提升开发效率、增强性能与安全性、适配现代技术场景展开。本文汇总了 Java 8 到 Java 25 的核心新特性,帮助你快速把握语言演进脉络。
Java 8(LTS)—— 函数式编程的里程碑
Java 8 是史上最具颠覆性的版本之一,引入了函数式编程范式,彻底改变了 Java 代码的编写方式。
Lambda 表达式:用简洁的语法实现匿名函数,替代冗长的匿名内部类。例如:
List<String> list = Arrays.asList("a", "b", "c");
list.forEach(s -> System.out.println(s)); // Lambda 简化迭代
Stream API:为集合提供声明式处理能力,支持过滤、映射、聚合等操作,且原生支持并行计算:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
.filter(n -> n % 2 == 0)
.mapToInt(n -> n * 2)
.sum();
接口默认方法与静态方法:允许接口定义带实现的 default 方法,解决了接口升级的兼容性问题;静态方法则为接口提供工具类能力。
Optional 类:通过容器化 null 值,强制开发者处理空指针场景,减少 NullPointerException:
Optional<String> name = Optional.ofNullable(getName());
name.ifPresent(n -> System.out.println("Name: " + n)); // 安全处理可能为 null 的值
新日期时间 API(java.time):替代线程不安全的 SimpleDateFormat 和 Date,提供 LocalDate、Instant 等不可变类,支持链式操作。
其他亮点:方法引用(:: 语法)、Nashorn JavaScript 引擎、Base64 内置支持等。
Java 9 —— 模块化与工具链升级
时隔 3 年发布的 Java 9 聚焦于大型应用的模块化管理和开发效率提升。
模块化系统(Project Jigsaw):引入 module 概念,通过 module-info.java 声明模块依赖和导出包,实现代码隔离与按需加载,减少内存占用。
JShell 交互式工具:支持即时执行 Java 代码片段,无需编写类和 main 方法,适合快速验证逻辑或学习语法:
集合工厂方法:新增 List.of()、Set.of()、Map.of() 等静态方法,便捷创建不可变集合(性能优于 Collections.unmodifiableXXX)。
接口私有方法:允许接口定义 private 方法,供默认方法复用逻辑,避免代码冗余。
Stream API 增强:新增 takeWhile()(保留满足条件的前缀)、dropWhile()(丢弃满足条件的前缀)、ofNullable()(支持单元素 null 安全流)。
Java 10 —— 简化开发的小步优化
Java 10 延续了 6 个月迭代周期(Oracle 政策),主要带来局部变量简化和性能提升。
局部变量类型推断(var 关键字):编译器可根据赋值自动推断局部变量类型,减少代码冗余(仅限方法内局部变量):
var list = new ArrayList<String>(); // 等价于 ArrayList<String> list
var map = new HashMap<Integer, String>();
应用类数据共享(AppCDS):扩展类数据共享(CDS)功能,允许跨应用共享已加载的类数据,缩短应用启动时间。
线程局部握手:支持单独暂停某个线程进行调试或监控,无需暂停整个 JVM,提升系统可用性。
Java 11(LTS) —— 长期支持的实用升级
Java 11 是继 Java 8 后的第二个 LTS 版本,强化了字符串处理和网络能力。
字符串增强:新增 isBlank()(判断空白字符串)、strip()(智能去除前后空格)、lines()(按行拆分)、repeat(n)(重复字符串):
" hello ".strip(); // 结果为 "hello"(区别于 trim(),支持 Unicode 空白)
"a\nb\nc".lines().count(); // 结果为 3
"ab".repeat(3); // 结果为 "ababab"
HttpClient 标准化:替代老旧的 HttpURLConnection,支持同步 / 异步请求,API 更简洁:
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.build();
client.sendAsync(request, BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println); // 异步请求并打印响应
ZGC 实验性引入:新一代低延迟垃圾收集器,目标暂停时间 < 10ms,支持 TB 级内存。
移除项:删除 Nashorn 引擎、CORBA 模块等过时组件。
Java 12 —— 语法糖与性能优化
Switch 表达式预览:支持 case 1 -> 10 形式的表达式语法,简化分支逻辑(后续版本转正):
int result = switch (day) {
case MONDAY, FRIDAY -> 6;
case TUESDAY -> 7;
default -> 8;
};
Shenandoah 垃圾收集器(实验性):低延迟 GC,通过并发压缩解决内存碎片问题,适合大型应用。
数字格式化增强:CompactNumberFormat 支持 “1k”“1M” 等紧凑格式,适配国际化场景。
Java 13 —— 文本块与 Switch 完善
文本块预览:用 """ 定义多行字符串,自动处理换行和缩进,告别拼接符 +:
String html = """
<html>
<body>Hello, World</body>
</html>
"""; // 保留格式的多行字符串
Switch 表达式二次预览:新增 yield 关键字用于返回值,解决复杂分支的结果返回问题。
ZGC 增强:支持将未使用的内存归还给操作系统,优化资源占用。
Java 14 —— Records 与空指针优化
Records 预览:简化 “数据载体类”(仅存属性和 getter)的定义,自动生成 equals()、hashCode()、toString():
record Point(int x, int y) {} // 等价于包含 x、y 及相关方法的类
NullPointerException 增强:错误信息将明确指出 null 值的具体位置,例如 “Cannot invoke "String.length ()" because "s" is null”。
Switch 表达式正式转正:-> 语法和 yield 关键字成为标准特性。
Java 15 —— 密封类与 ZGC 转正
密封类(Sealed Classes)预览:限制类的继承关系,通过 sealed 关键字指定允许继承的子类,增强代码可维护性:
sealed class Shape permits Circle, Rectangle {}
final class Circle extends Shape {}
final class Rectangle extends Shape {}
ZGC 正式转正:低延迟垃圾收集器从实验性变为正式特性,适合高吞吐量、低延迟场景。
文本块正式转正:""" 语法成为标准,支持 stripIndent()、translateEscapes() 等方法。
Java 16 —— Records 转正与向量 API
Records 正式转正:作为不可变数据载体的简化语法,广泛用于 DTO、POJO 等场景。
向量 API(Incubator):提供硬件加速的向量计算能力,适合科学计算、机器学习等场景。
默认启用 CDS 存档:默认生成类数据共享存档,提升应用启动速度。
Java 17(LTS)—— 密封类转正与长期支持
Java 17 是继 Java 11 后的第三个 LTS 版本,聚合了多个成熟特性。
密封类正式转正:sealed、non-sealed、permits 关键字成为标准,控制类继承边界。
增强的伪随机数生成器:新增 RandomGenerator 接口,统一各类随机数生成器的 API。
移除实验性 AOT 和 JIT 编译器:聚焦核心功能优化。
Java 18 —— 简单 Web 服务器与 UTF-8 默认编码
简单 Web 服务器:内置轻量级 HTTP 服务器(com.sun.net.httpserver 增强),适合开发测试场景。
UTF-8 作为默认字符编码:替代传统的平台相关编码,解决跨环境字符集问题。
向量 API 第二次孵化:优化向量计算的性能和易用性。
Java 19 —— 虚拟线程与结构化并发
虚拟线程(预览):轻量级线程,由 JVM 管理而非操作系统,支持百万级并发,大幅降低线程创建成本:
// 虚拟线程简化高并发任务
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
IntStream.range(0, 10_000).forEach(i ->
executor.submit(() -> {
Thread.sleep(Duration.ofSeconds(1));
return i;
})
);
}
结构化并发(预览):将多个相关任务视为一个整体,简化并发编程的错误处理和资源管理。
Java 20 —— 作用域值与模式匹配
作用域值(预览):替代 ThreadLocal,在虚拟线程场景下更安全地共享上下文信息。
模式匹配 for switch(预览):允许在 switch 中使用类型模式和守卫条件,增强分支逻辑的灵活性:
static String format(Object obj) {
return switch (obj) {
case Integer i -> String.format("int %d", i);
case Long l -> String.format("long %d", l);
case String s -> String.format("string %s", s);
default -> obj.toString();
};
}
Java 21(LTS)—— 虚拟线程转正与模式匹配完善
Java 21 作为 LTS 版本,将多个实验性特性转正,大幅提升并发编程效率。
虚拟线程正式转正:成为标准特性,彻底改变 Java 高并发编程模式。
模式匹配 for switch 正式转正:支持类型模式、记录模式等,简化复杂条件判断。
sequenced 集合 :新增 SequencedCollection、SequencedSet、SequencedMap 接口,统一有序集合的操作(如 reversed())。
Java 22 —— 字符串模板与外部函数
字符串模板(预览):通过 \{} 语法在字符串中嵌入表达式,替代 String.format(),支持编译时校验:
String name = "Alice";
String info = STR."Hello, \{name}! Age: \{30}"; // 结果为 "Hello, Alice! Age: 30"
外部函数与内存 API(预览):简化 Java 与 native 代码的交互,更安全地操作堆外内存。
Java 23 —— 数组排序增强与异步编程
数组排序算法优化:对 Arrays.sort() 进行底层优化,提升大型数组的排序性能。
结构化并发第二次预览:完善 API 设计,强化任务间的依赖管理和异常处理。
Java 24 —— 模式匹配扩展与垃圾回收优化
记录模式嵌套匹配:支持在模式匹配中嵌套使用记录模式,简化复杂对象的解构:
record Point(int x, int y) {}
record Line(Point start, Point end) {}
static void printLine(Line line) {
if (line instanceof Line(Point(int x1, int y1), Point(int x2, int y2))) {
System.out.printf("Line from (%d,%d) to (%d,%d)", x1, y1, x2, y2);
}
}
Shenandoah GC 增强:进一步降低延迟,优化大内存场景下的表现。
Java 25 —— 字符串模板转正与并发工具升级
字符串模板正式转正:STR、FMT 等处理器成为标准,支持安全的字符串拼接和格式化。
虚拟线程调试工具增强:提供更完善的虚拟线程监控和调试能力,降低排查并发问题的难度。
Vector API 正式转正:硬件加速的向量计算 API 稳定发布,提升数值计算性能。
总结
Java 8 到 Java 25 的演进呈现三大趋势:
语法简化:从 Lambda 到 Records、文本块,持续减少样板代码。
并发升级:虚拟线程、结构化并发重新定义高并发编程模式。
性能与安全:ZGC/Shenandoah 降低延迟,密封类、作用域值提升代码安全性。
可根据项目需求选择 LTS 版本(8、11、17、21)保证稳定性,或尝试最新版本体验前沿特性。
评论