0 前言
官宣发布:
IDEA已支持下载:
1 JEPs
JEP 455 Primitive Types in Patterns, instanceof, and switch (Preview)
通过允许在所有模式上下文中使用原始类型模式,增强了模式匹配,并扩展了 instanceof
和 switch
以适用于所有原始类型。这是一项预览语言特性。
JEP 466 Class-File API (Second Preview)
提供解析、生成和转换 Java 类文件的标准 API。这是一项预览 API。
JEP 467 Markdown文档注释
使 JavaDoc 文档注释能够用 Markdown 而非 HTML 和 JavaDoc @
标签的混合体编写。
JEP 469 Vector API (Eighth Incubator)
引入一个 API 来表达向量计算,这些计算在运行时可靠地编译为支持的 CPU 架构上的最佳向量指令,从而实现优于等效标量计算的性能。
JEP 471 废除 Memory-Access Methods in sun.misc.Unsafe for Removal
将 sun.misc.Unsafe
中的内存访问方法标记为将来版本中删除。这些不受支持的方法已被标准 API 取代,即 VarHandle API (JEP 193, JDK 9) 和 Foreign Function & Memory API (JEP 454, JDK 22)。强烈鼓励库开发者从 sun.misc.Unsafe
迁移到支持的替代品,以便应用程序能够顺利迁移到现代 JDK 版本。
JEP 473 Stream Gatherers (Second Preview)
增强 Stream API 以支持自定义中间操作。这将允许流管道以不容易用现有内置中间操作实现的方式转换数据。这是一项预览 API。
JEP 474 ZGC: Generational Mode by Default
将ZGC默认模式切换为分代模式。弃用非分代模式,并计划在未来版本中删除。
JEP 476 Module Import Declarations (Preview)
简洁地导入模块导出的所有包。简化了模块库重用,但不需要导入代码本身处于模块中。预览语言特性。
JEP 477 Implicitly Declared Classes and Instance Main Methods (Third Preview)
发展 Java 编程语言,以便初学者在不需要理解为大型程序设计的语言特性的情况下编写首个程序。远非使用语言的单独方言,初学者可为单类程序编写简化的声明,然后随技能提升,无缝扩展程序以使用更高级特性。经验丰富开发同样可享受简洁编写小程序乐趣,而无需使用旨在大规模编程的构造。预览语言特性。
JEP 480 Structured Concurrency (Third Preview)
通过引入 结构化并发 API简化并发编程。结构化并发将不同线程中运行的一组相关任务视为单一工作单元,简化错误处理和取消操作,提高可靠性,并增强可观察性。预览 API。
JEP 481 Scoped Values (Third Preview)
引入 作用域值,使方法能在线程内与其被调用者共享不可变数据,并与子线程共享。作用域值比线程局部变量更易理解。还具有更低空间和时间成本,尤其与虚拟线程 (JEP 444) 和结构化并发 (JEP 480) 一起使用时。预览 API。
JEP 482 Flexible Constructor Bodies (Second Preview)
允许在显式构造函数调用(即 super(..)
或 this(..)
)之前出现语句。这些语句不能引用正在构造的实例,但它们可初始化其字段。在调用另一个构造函数之前初始化字段,当方法被覆盖时,可以使类更可靠。预览语言特性。
2 新特性
带明确区域设置的控制台方法 (JDK-8330276)
core-libs/java.io
java.io.Console
类添加了以下方法,这些方法接受一个 java.util.Locale
参数:
public Console format(Locale locale, String format, Object ... args)
public Console printf(Locale locale, String format, Object ... args)
public String readLine(Locale locale, String format, Object ... args)
public char[] readPassword(Locale locale, String format, Object ... args)
用户现在可以用指定的 Locale
格式化输出字符串或显示提示文本,该 Locale
可能与默认区域设置无关。例如,代码片段 System.console().printf(Locale.FRANCE, "%1$tY-%1$tB-%1$te %1$tA", new Date())
将显示:
2024-五月-16 星期四
支持直到另一个瞬间的持续时间 (JDK-8331202)
core-libs/java.time
java.time.Instant
类添加了一个新的方法,以获得直到指定 Instant
的 Duration
。新方法 Instant.until(Instant)
产生的持续时间与 Duration.between(Temporal, Temporal)
相同,但更易于用户发现。此外,与 Instant.until(Temporal, TemporalUnit)
方法相比,新方法直接返回一个 Duration
,无需单位转换。
新的 Parallel GC Full GC 算法 (JDK-8329203)
hotspot/gc
Parallel GC 现在使用与 Serial GC 和 G1 GC Full GCs 中相同的 Full GC 算法。
以前的算法包括通过 Java 堆中的每个活动对象进行三次传递:
- 标记活动对象
- 计算每个活动对象的新位置
- 移动对象到新位置并更新每个对象的字段
在第 2 步中计算的对象位置使用非堆内存存储,以避免通过 Java 堆中的活动对象进行第四次传递。问题是这种方案对于某些问题工作负载来说扩展性不好。此外,这种数据结构使用 Java 堆的 1.5% 作为非堆内存。
新算法对于问题工作负载的性能显著更好,并且不需要额外的内存,减少了所有工作负载的占用空间。
3 已移除的特性和选项
移除 ThreadGroup.stop
(JDK-8320786)
core-libs/java.lang
在此版本中已移除 java.lang.ThreadGroup.stop()
方法。这个固有不安全的方法在 JDK 1.2 (1998) 中已被弃用,在 Java 18 中弃用于删除,并在 Java 20 中重新规定/降级为无条件抛出 UnsupportedOperationException
。使用此方法的代码将不再编译。在旧版本上编译的代码,如果在使用 JDK 23 或更新版本时执行,现在会抛出 NoSuchMethodError
而不是 UnsupportedOperationException
。
移除 Thread.suspend/resume
和 ThreadGroup.suspend/resume
(JDK-8320532)
core-libs/java.lang
在此版本中已移除 java.lang.Thread.suspend()
、java.lang.Thread.resume()
、java.lang.ThreadGroup.suspend()
和 java.lang.ThreadGroup.resume()
方法。这些容易死锁的方法在 JDK 1.2 (1998) 中已被弃用,在 Java 14 中弃用于删除,并在 Java 19/20 中重新规定/降级为无条件抛出 UnsupportedOperationException
。使用这些方法的代码将不再编译。在旧版本上编译的代码,如果在使用 JDK 23 或更新版本时执行,现在会抛出 NoSuchMethodError
而不是 UnsupportedOperationException
。
移除模块 jdk.random
(JDK-8330005)
core-libs/java.util
已从 JDK 中移除 jdk.random
模块。该模块包含 java.util.random.RandomGenerator
算法的实现。这些实现已移动到 java.base
模块,java.base
模块现在将负责支持这些算法。
依赖 jdk.random
模块的应用程序,无论是通过构建脚本还是通过模块依赖项,都应删除对此模块的引用。