菜单

Java 新特性

相关源文件

本页面概述了 Java 8 至 21 版本中引入的关键特性。它为希望了解 Java 随时间演变以及每个版本中可用新功能的开发者提供了全面的参考。有关特定 Java 框架或单个 Java 功能的更详细解释,请参阅其各自的文档页面。

Java 版本时间线和 LTS 概览

了解 Java 的发布周期对于计划版本迁移的开发者很重要。从 Java 9 开始,Oracle 采用了六个月的发布周期,并且每三年发布一个长期支持(LTS)版本。

主要 Java 版本时间线

来源:docs/java/new-features/java11.md8-13 docs/java/new-features/java21.md8-12

LTS 支持周期

来源:docs/java/new-features/java11.md8-13), docs/java/new-features/java17.md8-14

按版本划分的新特性

以下是每个主要 Java 版本中添加的关键功能的摘要

版本发布日期主要功能
Java 82014年3月Lambda 表达式、Stream API、函数式接口、Optional、接口中的默认方法、日期/时间 API
Java 92017年9月模块系统、JShell、改进的 Javadoc、集合工厂方法、私有接口方法、Stream API 增强
Java 102018年3月局部变量类型推断(var)、垃圾收集器改进、应用程序类数据共享
Java 112018年9月HTTP 客户端(标准)、ZGC、启动单文件源码程序、String/文件增强
Java 122019年3月Switch 表达式(预览)、Constants API、微基准测试套件、Shenandoah GC
Java 142020年3月Switch 表达式(标准)、Record(预览)、instanceof 的模式匹配(预览)、有用的 NullPointerException 信息
Java 152020年9月Sealed 类(预览)、文本块(标准)、ZGC 生产就绪、隐藏类
Java 162021年3月Record(标准)、instanceof 的模式匹配(标准)、Unix 域套接字通道、外部内存访问 API(孵化器)
Java 172021年9月Sealed 类(标准)、Switch 的模式匹配(预览)、外部函数与内存 API(孵化器)、Vector API(孵化器)
Java 192022年9月虚拟线程(预览)、结构化并发(孵化器)、Switch 的模式匹配(第四次预览)、外部函数与内存 API(预览)
Java 212023年9月虚拟线程(标准)、Switch 的模式匹配、Record 模式、字符串模板(预览)、有序集合

来源:docs/java/new-features/java8-common-new-features.md12-14), docs/java/new-features/java9.md8-9), docs/java/new-features/java11.md8-9), docs/java/new-features/java17.md8-14), docs/java/new-features/java21.md8-12

特性演进图

许多 Java 特性通过预览、孵化和标准化阶段跨越多个版本进行演进。

来源:docs/java/new-features/java16.md82-87), docs/java/new-features/java20.md22-23), docs/java/new-features/java21.md25-28

主要特性类别

Java 的发展可以分为几个主要改进领域

语言语法特性

来源:docs/java/new-features/java8-common-new-features.md100-106), docs/java/new-features/java10.md18-24), docs/java/new-features/java14-15.md34-52), docs/java/new-features/java16.md104-125), docs/java/new-features/java21.md31-40)

核心 API 增强

来源:docs/java/new-features/java8-common-new-features.md266-271), docs/java/new-features/java9.md60-64), docs/java/new-features/java11.md21-42), docs/java/new-features/java21.md128-132)

JVM 和 GC 改进

来源:docs/java/new-features/java9.md77-90), docs/java/new-features/java11.md73-91), docs/java/new-features/java12-13.md89-100), docs/java/new-features/java14-15.md148-156), docs/java/new-features/java21.md259-275)

核心特性详解

Lambda 表达式 (Java 8)

Lambda 表达式为 Java 带来了函数式编程,使得函数可以作为方法参数,并创建匿名函数。该特性是许多后续 Java 特征的基础。

Lambda 语法和用法:

// Basic syntax
(parameters) -> expression 
// or
(parameters) -> { statements; }

// Examples
Runnable r = () -> System.out.println("Hello World");
Consumer<String> c = s -> System.out.println(s);
Comparator<Integer> comp = (a, b) -> a - b;

Lambda 表达式适用于函数式接口——即只有一个抽象方法的接口(SAM)。Java 8 在 java.util.function 包中引入了几个内置的函数式接口。

函数式接口描述方法
Consumer<T>接受单个输入参数,不返回结果void accept(T t)
Supplier<T>不接受参数,但返回结果T get()
Function<T,R>接受一个参数并产生一个结果R apply(T t)
Predicate<T>表示一个断言(返回布尔值的函数)boolean test(T t)

来源:docs/java/new-features/java8-common-new-features.md100-115), docs/java/new-features/java8-common-new-features.md169-196)

Stream API (Java 8)

Stream API 提供了一种函数式的方式来处理对象集合。它支持以声明式的方式对数据集合进行 filter、map、reduce、find、match 和 sort 等操作。

Stream 的创建和操作:

Stream 的关键特性

  1. 不是数据结构,而是计算管道
  2. 为 Lambda 设计
  3. 不修改原始数据源
  4. 惰性求值 - 只有当调用终端操作时,处理才会发生
  5. 只能消费一次

来源:docs/java/new-features/java8-common-new-features.md266-290), docs/java/new-features/java8-common-new-features.md386-436)

模块化系统 (Java 9)

Java 9 引入了一个模块化系统,允许开发人员创建具有显式依赖关系的、定义良好的模块。这使得封装更好,并阐明了系统中不同部分之间的依赖关系。

模块化系统结构:

模块在 module-info.java 中定义,包含 exports 和 requires 语句。

JDK 的模块化被组织成大约 94 个标准模块,使平台更易于维护,并允许开发人员使用 jlink 创建更小的运行时镜像。

来源:docs/java/new-features/java9.md42-76)

局部变量类型推断 - var (Java 10)

Java 10 引入了 var 关键字,它支持局部变量类型推断,在保持静态类型的同时减少了样板代码。

var 的限制

  • 只能用于带初始化的局部变量
  • 不能用于方法参数
  • 不能用于字段
  • 不能用 null 初始化
  • 不能用于数组初始化
  • Java 11 中扩展了 var,使其可用于 lambda 参数列表

来源:docs/java/new-features/java10.md18-47), docs/java/new-features/java11.md93-110)

记录 (Record) (Java 16)

Records 提供了一种简洁的语法来声明类,这些类是不可变数据的透明载体。它们会自动实现构造函数、访问器、equals、hashCode 和 toString 方法。

Records 的演进

  • 在 Java 14 中作为预览版引入
  • 在 Java 15 中作为第二次预览版
  • 在 Java 16 中标准化

Records 适用于

  • 数据传输对象 (DTOs)
  • 领域驱动设计中的值对象
  • 不可变数据载体
  • 模式匹配目标

来源:docs/java/new-features/java14-15.md58-88), docs/java/new-features/java16.md104-125)

模式匹配 (Pattern Matching) (Java 16-21)

模式匹配允许测试一个对象是否具有某种类型或结构,并从中提取组件。该特性在多个 Java 版本中不断演进。

instanceof 的模式匹配 (Java 16)

Switch 的模式匹配 (Java 21)

Record 的模式匹配 (Java 21)

来源:docs/java/new-features/java16.md81-102), docs/java/new-features/java20.md43-141), docs/java/new-features/java21.md283-299)

虚拟线程 (Virtual Threads) (Java 21)

虚拟线程在 Java 19 中作为预览功能引入,并在 Java 21 中标准化。它们是轻量级的线程,可以通过使用每请求一个线程的风格编写并发应用程序来显著提高应用程序的吞吐量。

虚拟线程的关键特性

  1. 由 JVM 实现,而不是操作系统
  2. 高效共享 OS 线程(大量虚拟线程映射到一个平台线程)
  3. 轻量级 - 可以创建数百万个而不会出现资源问题
  4. 任务完成后自动释放(无需池化)
  5. 使用熟悉的 Thread API
  6. 非常适合 I/O 密集型工作负载
  7. 非常适合使用每请求一个线程模型的服务

创建虚拟线程

来源:docs/java/new-features/java19.md73-86), docs/java/new-features/java20.md209-275), docs/java/new-features/java21.md339-377)

外部函数与内存 API (Foreign Function & Memory API) (Java 21)

外部函数与内存 API 在 Java 17 中引入,并通过多个版本不断演进,为 Java 程序提供了一种与 Java 运行时外部的代码和数据进行交互的方式。这是 JNI 的更安全、更高效的替代方案。

关键组件

  1. 内存段 (MemorySegment) - 安全访问 Java 堆外的内存
  2. 内存布局 (MemoryLayout) - 描述内存内容的组织方式
  3. 外部函数接口 (Linker) - 与原生函数互操作

使用示例

演进历程

  • Java 17 首次孵化 (JEP 412)
  • Java 18 第二次孵化 (JEP 419)
  • Java 19 首次预览 (JEP 424)
  • Java 20 第二次预览 (JEP 434)
  • Java 21 第三次预览 (JEP 442)

来源:docs/java/new-features/java17.md160-166), docs/java/new-features/java19.md24-71), docs/java/new-features/java21.md300-306)

预览版和孵化版特性

Java 使用分阶段流程来引入重要特性

特性生命周期:

Java 21 中当前值得关注的预览/孵化特性

  1. 字符串模板 (Preview) - 提供一种更灵活、更易读的方式来创建包含嵌入式表达式的字符串内容

  2. 结构化并发 (Preview) - 将多个任务视为一个单一的工作单元,从而简化多线程编程

  3. 未命名模式和变量(预览) - 使用下划线(_)来表示未使用其值的变量

来源: docs/java/new-features/java21.md31-126), docs/java/new-features/java21.md308-337)

结论

自 Java 8 以来,Java 得到了显著的演进,语言特性和运行时改进都使得 Java 开发更具生产力和效率。主要趋势包括:

  1. 更简洁的语法 - `var`、`records` 和模式匹配等特性减少了样板代码
  2. 函数式编程支持 - Lambda 表达式、Stream API 和集合上的增强方法
  3. 性能改进 - 更优的垃圾收集器、虚拟线程和内存管理
  4. 系统编程能力 - Foreign Function & Memory API 和 Vector API
  5. 现代语言结构 - Switch 表达式、模式匹配和 sealed 类

了解这些特性有助于开发人员编写更有效、可维护且性能更好的 Java 代码。定期的发布周期确保 Java 在保持向后兼容性的同时,能够随着行业需求不断发展。

来源: docs/java/new-features/java8-common-new-features.md1046-1054), docs/java/new-features/java21.md379-383)