”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Java 已经到来 有什么新功能?

Java 已经到来 有什么新功能?

发布于2024-11-09
浏览:524

Java Has Arrived What

Java 23已正式发布!这是一个非 LTS(长期支持)版本。尽管它是一个短暂的版本,但 Java 23 包含了令人兴奋的改进、错误修复,并且还删除了您可能需要注意的功能和选项。

让我们深入了解新增内容以及它如何基于 JDK 21 和 JDK 22 等早期版本的功能构建。

范围值:基于 JDK 22 和 JDK 21 预览版构建

JDK 23 中最令人期待的功能之一是 范围值(预览版)。此功能也在 JDK 22 和 JDK 21 中预览,它简化了方法在线程和子线程之间共享不可变数据的方式。在以前的 Java 版本中,处理线程本地数据可能很麻烦并且需要大量内存。范围值通过提供更高效、更低开销的替代方案来改变这一点。

JDK 23 有什么不同? ScopedValue.callWhere() 方法现在使用新的函数接口,这使得编译器更容易推断是否可能引发已检查的异常。这也导致删除了 ScopedValue.getWhere() 方法,进一步简化了 API。

这是我们在早期版本中看到的改进的延续,很高兴看到范围值逐渐成为永久功能。

结构化并发:第三次预览

Java 的并发模型一直很强大,但管理起来却很棘手。输入结构化并发(预览版),它首次出现在 JDK 21 中,现在已经在 J​​DK 23 中达到第三个预览版。这里的想法是通过将在不同线程中运行的相关任务分组到一个线程中,使并发编程更加直观。单个工作单元。这简化了错误处理并提高了取消流程的可靠性。

在 JDK 23 中,结构化并发仍处于预览状态,但它继续使并发代码更易于推理且不易出错。如果您使用过 JDK 21 或 JDK 22 中的预览版,您将会欣赏到此功能的成熟程度。现在它可以更好地处理线程泄漏等常见并发问题,从而更轻松地编写可靠的多线程代码。

灵活的构造函数主体:自 JDK 22 以来不断发展

另一个受欢迎的补充是灵活的构造函数体(预览版)。首次在 JDK 22 中预览为“super() 之前的语句”,此功能允许开发人员在调用超类构造函数之前编写初始化代码。这个看似很小的变化可以使构造函数逻辑更加清晰,并防止在验证或其他设置逻辑失败时创建不必要的对象。

在 JDK 22 中,引入此功能是为了让开发人员更好地控制构造函数逻辑,JDK 23 中的第二个预览版继续完善该功能。通过将初始化逻辑移到超类调用之前,开发人员可以避免以前混乱的代码库的混乱辅助静态方法和中间构造函数。

隐式声明的类:第三次是一个魅力

对于那些教授 Java 或编写快速脚本的人来说,隐式声明的类和实例方法自 JDK 21 中引入以来已经改变了游戏规则。此功能允许初学者编写简化的 Java 程序,而无需理解从一开始就具有复杂的语言特征。

在 JDK 23 中,此功能得到了一些额外的升级。现在,隐式声明的类可以自动导入三个用于简单文本 I/O 的静态方法,并且它们还将按需导入 java.base 模块的所有公共顶级类和接口。这些增强功能有助于使新手的学习曲线更加平滑。

模块导入声明:新预览

JDK 23 中的新预览功能之一是模块导入声明。此功能允许您使用单个语句导入模块导出的所有包,从而简化了模块化库的重用。它对于初学者特别有用,因为他们不再需要记住包在层次结构中的位置,并且它减少了多个按需类型导入声明造成的混乱。

虽然这是 JDK 23 中的一个全新功能,但它在使 Java 的模块系统更易于访问方面显示出了巨大的希望,特别是对于那些刚接触模块化编程的人来说。

Markdown 文档评论:Javadoc 的新时代

老实说,用 HTML 和 @ 标签编写 JavaDoc 可能会很痛苦。在 JDK 23 中,Markdown 文档注释(预览)功能允许开发人员使用 Markdown 编写 API 文档,从而更轻松地创建可读、格式良好的注释。

虽然这是 JDK 23 中的新功能,但它本应该在几年前添加。 Markdown 在开发者社区中广泛使用,将其引入 JavaDoc 将使编写和维护文档变得更加容易。

Z 垃圾收集器 (ZGC):默认分代模式

如果您自 JDK 15 中引入以来一直在使用 Z 垃圾收集器 (ZGC),您会很高兴知道在 JDK 23 中,ZGC 现在默认为 分代模式(JEP 474)。此开关通过专注于频繁收集短期对象来提高应用程序性能。虽然非分代 ZGC 在此版本中已被弃用,但这清楚地表明分代方法是 Java 垃圾收集的未来。

如果您在 JDK 22 或更早版本上运行,那么迁移到 JDK 23 应该会带来显着的性能改进,而无需您付出太多努力。

Vector API:仍在孵化中,但更强大

JDK 16 中引入的 Vector API 允许开发人员执行向量计算,并在运行时编译为最佳向量指令。 API 不断发展,在 JDK 23 中,我们看到了第八个孵化器。该 API 仍在孵化中,这意味着它还不是最终确定的功能,但它正在逐渐接近成熟。

对于性能关键型应用程序,特别是那些处理大型数据集的应用程序,Vector API 可以提供巨大的加速。如果您在之前的孵化中使用过它(例如 JDK 22),您会发现它现在更加稳定,但它仍在等待最终的部分到位(可能与 Project Valhalla 相关)。

流收集者:第二次预览

JDK 22 引入了 Stream Gatherers(预览版),该功能通过允许自定义中间操作来增加 Stream API 的灵活性。在 JDK 23 中,它又回来了第二次预览。如果您喜欢使用流来处理数据,您会欣赏此功能以以前难以实现的方式转换数据管道的能力。

流收集器扩展了流的功能,使开发人员能够轻松处理更复杂的场景,特别是在使用无限流或自定义转换时。

类文件 API:第二次预览

如果您正在构建操作 Java 类文件的工具,JDK 23 中的 Class-File API(预览版)适合您。该 API 首次在 JDK 22 中引入,提供了一种解析和生成类文件的标准方法,无需使用 ASM 等第三方库。 JDK 23 中的第二个预览版改进了此 API,使其更加精简且更易于使用。

对于工具开发人员来说,这是一件大事。每次 JVM 规范发生变化时,不再需要忙着更新库 — Java 现在有了第一方解决方案。

总结:您应该升级吗?

Java 23 可能不是 LTS 版本,但它包含基于 JDK 21 和 JDK 22 引入的令人兴奋的功能。从范围值和结构化并发到更好的垃圾收集器以及对流和构造函数的改进,此版本推动了 Java 开发。

版本声明 本文转载于:https://dev.to/isaactony/java-23-has-arrived-whats-new-9-minute-read-i61?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何使用Java.net.urlConnection和Multipart/form-data编码使用其他参数上传文件?
    如何使用Java.net.urlConnection和Multipart/form-data编码使用其他参数上传文件?
    使用http request 上传文件上传到http server,同时也提交其他参数,java.net.net.urlconnection and Multipart/form-data Encoding是普遍的。 Here's a breakdown of the process:Mu...
    编程 发布于2025-05-18
  • 如何使用Regex在PHP中有效地提取括号内的文本
    如何使用Regex在PHP中有效地提取括号内的文本
    php:在括号内提取文本在处理括号内的文本时,找到最有效的解决方案是必不可少的。一种方法是利用PHP的字符串操作函数,如下所示: 作为替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式来搜索特...
    编程 发布于2025-05-18
  • 同实例无需转储复制MySQL数据库方法
    同实例无需转储复制MySQL数据库方法
    在同一实例上复制一个MySQL数据库而无需转储在同一mySQL实例上复制数据库,而无需创建InterMediate sqql script。以下方法为传统的转储和IMPORT过程提供了更简单的替代方法。 直接管道数据 MySQL手动概述了一种允许将mysqldump直接输出到MySQL clie...
    编程 发布于2025-05-18
  • 对象拟合:IE和Edge中的封面失败,如何修复?
    对象拟合:IE和Edge中的封面失败,如何修复?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    编程 发布于2025-05-18
  • 用户本地时间格式及时区偏移显示指南
    用户本地时间格式及时区偏移显示指南
    在用户的语言环境格式中显示日期/时间,并使用时间偏移在向最终用户展示日期和时间时,以其localzone and格式显示它们至关重要。这确保了不同地理位置的清晰度和无缝用户体验。以下是使用JavaScript实现此目的的方法。方法:推荐方法是处理客户端的Javascript中的日期/时间格式化和时...
    编程 发布于2025-05-18
  • 如何在鼠标单击时编程选择DIV中的所有文本?
    如何在鼠标单击时编程选择DIV中的所有文本?
    在鼠标上选择div文本单击带有文本内容,用户如何使用单个鼠标单击单击div中的整个文本?这允许用户轻松拖放所选的文本或直接复制它。 在单个鼠标上单击的div元素中选择文本,您可以使用以下Javascript函数: function selecttext(canduterid){ if(do...
    编程 发布于2025-05-18
  • PHP阵列键值异常:了解07和08的好奇情况
    PHP阵列键值异常:了解07和08的好奇情况
    PHP数组键值问题,使用07&08 在给定数月的数组中,键值07和08呈现令人困惑的行为时,就会出现一个不寻常的问题。运行print_r($月份)返回意外结果:键“ 07”丢失,而键“ 08”分配给了9月的值。此问题源于PHP对领先零的解释。当一个数字带有0(例如07或08)的前缀时,PHP将...
    编程 发布于2025-05-18
  • 解决MySQL插入Emoji时出现的\\"字符串值错误\\"异常
    解决MySQL插入Emoji时出现的\\"字符串值错误\\"异常
    Resolving Incorrect String Value Exception When Inserting EmojiWhen attempting to insert a string containing emoji characters into a MySQL database us...
    编程 发布于2025-05-18
  • 如何将来自三个MySQL表的数据组合到新表中?
    如何将来自三个MySQL表的数据组合到新表中?
    mysql:从三个表和列的新表创建新表 答案:为了实现这一目标,您可以利用一个3-way Join。 选择p。*,d.content作为年龄 来自人为p的人 加入d.person_id = p.id上的d的详细信息 加入T.Id = d.detail_id的分类法 其中t.taxonomy =...
    编程 发布于2025-05-18
  • Java的Map.Entry和SimpleEntry如何简化键值对管理?
    Java的Map.Entry和SimpleEntry如何简化键值对管理?
    A Comprehensive Collection for Value Pairs: Introducing Java's Map.Entry and SimpleEntryIn Java, when defining a collection where each element com...
    编程 发布于2025-05-18
  • 大批
    大批
    [2 数组是对象,因此它们在JS中也具有方法。 切片(开始):在新数组中提取部分数组,而无需突变原始数组。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    编程 发布于2025-05-18
  • FastAPI自定义404页面创建指南
    FastAPI自定义404页面创建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    编程 发布于2025-05-18
  • Go语言垃圾回收如何处理切片内存?
    Go语言垃圾回收如何处理切片内存?
    在Go Slices中的垃圾收集:详细的分析在GO中,Slice是一个动态数组,引用了基础阵列。使用切片时,了解垃圾收集行为至关重要,以避免潜在的内存泄漏。考虑使用slice使用slice的以下实现:字符串{ R:=(*Q)[0] *q =(*q)[1:len(*q)] 返回...
    编程 发布于2025-05-18
  • 如何实时捕获和流媒体以进行聊天机器人命令执行?
    如何实时捕获和流媒体以进行聊天机器人命令执行?
    在开发能够执行命令的chatbots的领域中,实时从命令执行实时捕获Stdout,一个常见的需求是能够检索和显示标准输出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    编程 发布于2025-05-18
  • 如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    Transform Pandas DataFrame Column to DateTime FormatScenario:Data within a Pandas DataFrame often exists in various formats, including strings.使用时间数据时...
    编程 发布于2025-05-18

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3