JDK 22 新特性

JDK各个版本特性查看地址:https://openjdk.org/projects/jdk/17/(修改后面数字即可,目前最新的是23)

JDK 22 于 2024 年 3 月 19 日全面发布。

一,开发计划

2023/12/07Rampdown Phase One (fork from main line)
第一阶段(从主线分叉)
2024/01/18Rampdown Phase Two  第二阶段
2024/02/08Initial Release Candidate初始候选版本
2024/02/22Final Release Candidate  最终候选版本
2024/03/19General Availability 通用可用性

二,新特性

423   Region Pinning for G1(G1的区域固定)
447    Statements before super(...)
454   Foreign Function & Memory API(外部函数和内存 API)
456   Unnamed Variables & Patterns(未命名变量和模式)
457   Class-File API(类文件 API)
458   Launch Multi-File Source-Code Programs(启动多文件源代码程序)
459   String Templates(字符串模板)
460   Vector API
461   Stream Gatherers(流收集器)
462   Structured Concurrency(结构化并发)
463   Implicitly Declared Classes and Instance Main Methods(隐式声明的类和实例主要方法)
464   Scoped Values

三,分析

423:    Region Pinning for G1(G1的区域固定)

概括:通过在 G1 中实现区域固定来减少延迟,以便在 Java 本机接口 (JNI) 关键区域期间无需禁用垃圾收集。

目标是:不会因 JNI 关键区域而导致线程停顿。Java 线程将永远不会等待 G1 GC 操作完成。

当 Java 线程位于关键区域时,JVM 必须注意不要在垃圾收集期间移动关联的关键对象。它可以通过将这些对象固定到它们的位置来实现这一点,本质上是在 GC 移动其他对象时将它们锁定在适当的位置。或者,只要线程位于关键区域,它就可以简单地禁用 GC。

默认 GC G1 采用后一种方法,在每个关键区域禁用 GC。这对延迟有显着影响:如果 Java 线程触发 GC,那么它必须等待,直到关键区域中没有其他线程。影响的严重程度取决于关键区域的频率和持续时间。在最糟糕的情况下,用户报告关键部分会阻塞整个应用程序几分钟,由于线程匮乏而导致不必要的内存不足情况,甚至虚拟机过早关闭。由于这些问题,一些 Java 库和框架的维护者选择默认不使用关键区域(例如 JavaCPP),甚至根本不使用关键区域(例如 Netty),尽管这样做会对吞吐量产生不利影响。


447:    Statements before super(...)

概括:在 Java 编程语言的构造函数中,允许不引用正在创建的实例的语句出现在显式构造函数调用之前。

目标是:为开发人员提供了更大的自由来表达构造函数的行为,从而可以更自然地放置目前必须纳入辅助静态方法、辅助中间构造函数或构造函数参数中的逻辑。

简单的说是,在子类继承父类的情况下,子类构造方法里,可以在super()前调用方法做参数的预校验等。

“我们需要超越自 Java 1.0 以来强制执行的简单语法要求,即“ super(..) 或 this(..) 必须是第一个语句””


454:    Foreign Function & Memory API(外部函数和内存 API)

概括:引入一个FFM  API,Java 程序可以通过该 API 与 Java 运行时之外的代码和数据进行互操作。通过有效地调用外部函数(即 JVM 外部的代码),并安全地访问外部内存(即不受 JVM 管理的内存),API 使 Java 程序能够调用本机库并处理本机数据,而不会出现JNI的脆弱性和危险。 

简单的说是,新引入FFM(Foreign Function & Memory) API去替换旧的JNI,去操作堆外内存。


456:    Unnamed Variables & Patterns(未命名变量和模式)

概括:使用未命名变量和未命名模式增强 Java 编程语言,当需要变量声明或嵌套模式但从未使用时可以使用它们。两者都由下划线字符 _ 表示。

目标是:捕获开发人员的意图,即给定的绑定或 lambda 参数未使用,并强制执行该属性,以便澄清程序并减少出错的机会。允许多个模式出现在单个 case 标签中,前提是它们都没有声明任何模式变量。

JDK 22之前
 

static int count(Iterable<Order> orders) {
    int total = 0;
    for (Order order : orders)    // order is unused
        total++;
    return total;
}

JDK 22, 用_来表示未命名的变量

static int count(Iterable<Order> orders) {
    int total = 0;
    for (Order _ : orders)    // Unnamed variable
        total++;
    return total;
}


457:    Class-File API(类文件 API)

概括:提供用于解析、生成和转换 Java 类文件的标准 API。 目前还是预览版本。

目标:提供用于处理跟踪 Java 虚拟机规范定义的 class 文件格式的类文件的 API。使JDK组件能够迁移到标准API,并最终删除第三方ASM库的JDK内部副本。

简单的说是,要替换掉2002年开始的ASM库。

“自从 ASM 创建以来,Java 语言已经有了很大的改进,因此 2002 年最好的 API 习惯在二十年后可能不再理想。”


458:    Launch Multi-File Source-Code Programs(启动多文件源代码程序)

概括:增强 java 应用程序启动器,使其能够运行作为多个Java源代码文件提供的程序


459:    String Templates(字符串模板)

概括:使用字符串模板增强 Java 编程语言。字符串模板通过将文字文本与嵌入式表达式和模板处理器耦合来生成专门的结果,从而补充了 Java 现有的字符串文字和文本块。

目标是:通过轻松表达包含运行时计算值的字符串,简化 Java 程序的编写。增强混合文本和表达式的表达式的可读性,无论文本适合单个源行(如字符串文字)还是跨越多个源行(如文本块)。简化接受非 Java 语言(例如 SQL、XML 和 JSON)编写的字符串的 API 的使用。

示例

String name    = "Joan Smith";
String phone   = "555-123-4567";
String address = "1 Maple Drive, Anytown";
String json = """
    {
        "name":    "%s",
        "phone":   "%s",
        "address": "%s"
    }
    """.formatted(name, phone, address);

JSONObject doc = JSON.parse(json);


460:    Vector API

概括:引入 API 来表达向量计算,在运行时可靠地编译为支持的 CPU 架构上的最佳向量指令,从而实现优于同等标量计算的性能。

目标是:清晰简洁的 API — API 应能够清晰简洁地表达各种向量计算,这些向量计算由循环内组成的向量运算序列组成,并可能包含控制流。应该可以表达关于向量大小或每个向量的通道数的通用计算,从而使此类计算能够跨支持不同向量大小的硬件移植。与平台无关——API 应该与 CPU 架构无关,从而能够在支持向量指令的多个架构上实现。

简单的说,一股GPT味儿,这是Java向AI底层计算迈进的信号吧,不知道开发者买不买账?


461:    Stream Gatherers(流收集器)

概括:增强 Stream API 以支持自定义中间操作。这将允许流管道以现有内置中间操作不易实现的方式转换数据。

目标:尽可能允许自定义中间操作来操作无限大小的流。


462:    Structured Concurrency(结构化并发)

概括:通过引入结构化并发 API 来简化并发编程。结构化并发将在不同线程中运行的相关任务组视为单个工作单元,从而简化错误处理和取消、提高可靠性并增强可观察性。

目标是:推广一种并发编程风格,可以消除因取消和关闭而产生的常见风险,例如线程泄漏和取消延迟。提高并发代码的可观察性。


463:    Implicitly Declared Classes and Instance Main Methods(隐式声明的类和实例主要方法)

概括:学生无需使用单独的语言方言,而是可以为单类程序编写简化的声明,然后随着技能的增长无缝扩展他们的程序以使用更高级的功能。

目标是:为 Java 编程提供一个平稳的入门通道,以便教师可以循序渐进地介绍概念。帮助学生以简洁的方式编写基本程序,并随着他们的技能增长而优雅地扩展他们的代码。不要引入单独的初学者工具链;学生程序应该使用与编译和运行任何 Java 程序相同的工具来编译和运行。

简单的说,就是降低学习Java的难度,不管怎样,先骗入门再说!

以后hello world就是下面这样写了


464:    Scoped Values

概括:引入作用域值,这使得能够与同一线程中的子帧以及子线程管理不可变数据的共享。作用域值比线程局部变量更容易推理,并且空间和时间成本更低,特别是与虚拟线程和结构化并发结合使用时。

目标是:易于使用——应该很容易推理数据流。可理解性——共享数据的生命周期从代码的语法结构中是可见的。鲁棒性——调用者共享的数据只能由合法的被调用者检索。性能——数据可以在大量线程之间有效地共享。

简单的说,就是可以共享变量了。

JDK23马上要来了, 你升级JDK8了吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/678315.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

10款你一定不知道的实用工具!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 1. S激活工具——KMS激活工具 HEU_KMS_Activator&#xff0c;一款KMS激活工具&#xff0c;适用于Windows、Office及VL版本&#xff0c;无需联网…

MySql学习(一)——MySQL概述之MySQL的启动

文章目录 一、MySQl概述1.1 启动MySQL1.2 客户端连接1.3 关系型数据库1.4 总结 一、MySQl概述 数据库&#xff1a;存储数据的仓库&#xff0c;数据是有组织的进行存储&#xff0c;简称为&#xff08;DB&#xff09;数据库管理系统&#xff1a;操纵和管理数据库的大型软件&…

模拟散列表-java

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 一、模拟散列表 二、算法思路 1.散列表 2.拉链法 3.开放寻址法 三、代码如下 1.拉链法代码如下&#xff1a; 2.开放寻址法代码如下&#xff1a; 3.读入数据 3.代码运行结…

scipy.io.loadmat加载.mat文件,出现KeyError: ‘xxx‘

源代码&#xff1a; input_image loadmat(rC:\Users\admin\Downloads\Indian_Pines\SVM/aa.mat)[aa] #影像图 错误显示&#xff1a; 解决方法&#xff1a; 因为loadmat函数读取出来的高光谱数据是dict格式的所以需要定位才能进行后续操作&#xff0c;定位通常是通过列名&a…

GraphQL(4):GraphQL clients访问接口

下面演示在GraphQL clients访问GraphQL 接口 1 修改baseType.js 添加可供用户访问的静态资源路径 代码如下&#xff1a; const express require(express); const {buildSchema} require(graphql); const grapqlHTTP require(express-graphql).graphqlHTTP; // 定义schema…

深度学习500问——Chapter10:强化学习(1)

文章目录 10.1 强化学习的主要特点 10.1.1 定义 10.2 强化学习应用实例 10.3 强化学习和监督式学习、非监督式学习的区别 10.3.1 强化学习和监督式学习的区别 10.3.2 强化学习和非监督式学习的区别 10.1 强化学习的主要特点 其他许多机器学习算法中学习器都是学得怎样做&#…

0基础学习区块链技术——推演猜想

在《0基础学习区块链技术——入门》一文中&#xff0c;我们结合可视化工具&#xff0c;直观地感受了下区块的结构&#xff0c;以及链式的前后关系。 本文我们将抛弃之前的知识&#xff0c;从0开始思考和推演&#xff0c;区块链技术可能是如何构思出来的。 去中心 在一般的思维…

SpringSecurity6从入门到实战之SpringSecurity整合自动装配详解(源码级讲解,耐心看完)

SpringSecurity6从入门到实战之SpringSecurity整合自动装配详解 这里我先引出问题然后再来一步步进行剖析,SpringSecurity到底是如何实现引入依赖后所有请求都需要进行认证并且会弹出login登录表单页面. 接下来会对SpringBoot的自动装配进行详解,SpringSecurity也是通过自动装配…

【渗透测试】DC-1靶机实战(上)漏洞扫描获取反弹shell

目录 一、范围界定 二、信息收集 三、目标识别 1&#xff09;主机发现 2&#xff09;端口扫描 四. 服务枚举 1&#xff09;网站首页 2&#xff09;Web指纹识别 3&#xff09;nikto报告 4&#xff09;robots.txt 5&#xff09;UPGRADE.txt 五. 漏洞映射 1&#xff…

【项目管理常见问题大揭秘】每个管理者都要Get的「五维思维」~

走上管理岗☸要懂得五维思维 &#x1f4bc;自我管理——做自己的CEO 严于律己&#xff1a;严格要求自己&#xff0c;注重个人品牌建设 宽以待人&#xff1a;接纳不同观点&#xff0c;提升团队凝聚力 尊重事实&#xff1a;鼓励团队成员发挥优势&#xff0c;避免负面评价 坚守诚…

Mysql基础教程(15):别名

MySQL 别名 在本文中&#xff0c;我们讨论了 MySQL 中的列别名&#xff0c;表别名和派生表别名&#xff0c;以及使用别名来简化 SQL 和提高 SQL 的可读性。 如果在一个 SQL 中涉及到多个表&#xff0c;我们需要使用 table_name.column_name 这样的方式来引用每个表的字段&…

《科技和产业》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《科技和产业》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的第一批认定学术期刊 问&#xff1a;《科技和产业》是什么级别的&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a;中国科学技术协会 主办单位&…

猫毛过敏的克星!宠物空气净化器,铲屎官的终极武器~

现在很多人都喜欢养猫&#xff0c;但约有10%的人会对猫咪产生过敏反应。常见的症状包括打喷嚏、流鼻涕&#xff0c;严重时甚至会呼吸困难。 过敏源依附在宠物的毛发和皮屑上&#xff0c;通过空气传播&#xff0c;遍布家中的各个角落&#xff0c;如地面、衣物和家具。这不仅增加…

Jenkins+Rancher2.7部署构建

在Jenkins中使用rancher插件时需要去查找工作负载地址 在Rancher2.7没有查看Api按钮了需要自己去查找 1.进入https://192.168.x.xx:6443/v3/projects/ 2.输入在rancher中要查找的的项目名称并点击deployment连接进入下一个页面 3.找到自己的deployment随便点一个进去 4.浏览…

【数据结构】树与二叉树——二叉树的概念

二叉树的概念 导读一、二叉树的定义及其主要特性1.1 二叉树的定义1.2 二叉树的主要特性 二、特殊的二叉树2.1 满二叉树2.2 完全二叉树2.3 二叉排序树2.4 平衡二叉树 三、二叉树的性质3.1 性质一3.2 性质二3.3 性质三3.4 性质四3.5 性质五 结语 导读 大家好&#xff0c;很高兴又…

MFC 使用sapi文字转换为语音

文章目录 添加头文件声明变量 添加头文件 声明变量 pSpVoice NULL; //默认构造函数中初始化为空 bool CChKBarSCCodeApp::InitSpVoice() {HRESULT hr ::CoInitialize(NULL); // COM初始化if (!SUCCEEDED(hr)){AfxMessageBox(_T("声音环境初始化失败&#xff01;…

高中数学:解三角形-大题练习(第二问解题方法整理)

一、题型归纳 1、最值问题 例题1、例题2 2、恒等变换 例题3、例题4、例题5、例题6 3、图形问题 例题7、例题8 例题1 解析 第二小问 首先&#xff0c;正弦定理和余弦定理都可以解决这一题。下面我给出两种解法 1、余弦定理基本不等式 2、正弦定理辅助角公式 例题2 解析…

智能投顾:重塑金融理财市场,引领行业新潮流

一、引言 在数字化浪潮的推动下,金融行业正经历着前所未有的变革。其中,智能投顾作为金融科技的重要分支,以其高效、便捷和个性化的服务,逐渐成为金融理财市场的新宠。本文旨在探讨智能投顾如何引领金融理财新潮流,通过丰富的案例及解决方案,展示其独特的魅力和价值。 二…

记一次使用mysql存储过程时,游标取值为空问题

call modify_collation(num,count_num) > 1146 - Table test.table_name doesnt exist > 时间: 0.009s 我在使用mysql存储过程时&#xff0c;打印时游标取值为空&#xff0c;报错找不到表。我的过程语句是这样的&#xff1a; drop procedure if exists modify_collation…

推荐系统学习 二

双塔模型的结构 用户的特征&#xff0c;我们知道用户ID还能从用户填写的资料和用户行为中获取很多特征&#xff0c;包括离散特征和连续特征。所有这些特征不能直接输入神经网络&#xff0c;而是要先做一些处理&#xff0c;比如用embedding层把用户ID映射到一个向量 跟之前我们…