我们一起聊聊Java 18 新功能,你知道了吗?

兄弟姐妹们有没有人讲详细点的,我想问一下,我们一起聊聊Java 18 新功能,你知道了吗?
最新回答
七米海岸

2024-12-02 04:14:18

Java 18于2022年3月22日正式发布,作为非长期支持版本,此次更新共引入了9项新功能。

OpenJDK Java 18下载链接:jdk.java.net/18/

OpenJDK Java 18文档链接:openjdk.java.net/project...

JEP 400:默认UTF-8字符编码

JDK自始至终支持UTF-8字符编码,Java 18将UTF-8设置为默认编码。这意味着在不进行任何指定的情况下,所有需要用到编码的JDK API都使用UTF-8编码,从而避免因不同系统、地区和环境之间产生的编码问题。

例如,Mac OS默认使用UTF-8作为默认编码,但其他操作系统上,编码可能取决于系统配置或区域设置。在中国大陆的Windows系统中,GBK是默认编码。很多同学在学习Java时可能都遇到过在Windows系统的命令控制台中运行Java类时出现乱码的情况。

使用以下命令可以输出JDK的当前编码:

下面编写一个简单的Java程序,输出默认字符编码,然后输出中文汉字“你好”,看看Java 18和Java 17的运行区别。

系统环境:Windows 11

从以下运行结果中可以看到,使用JDK 17运行输出的默认字符编码是GBK,输出的中文“你好”已经乱码了;乱码是因为VSCode默认的文本编辑器编码是UTF-8,而中国地区的Windows 11默认字符编码是GBK,也是JDK 17默认获取到的编码,所以会在控制台输出时乱码;而使用JDK 18输出的默认编码就是UTF-8,所以可以正常输出中文“你好”。

JEP 408:简单的Web服务器

在Java 18中,提供了一个新命令jwebserver,运行该命令可以启动一个简单的、最小化的静态Web服务器,它不支持CGI和Servlet,因此最适合用于测试、教育、演示等需求。

在Java 18中,使用jwebserver启动一个Web服务器,默认发布的是当前目录。

在当前目录创建一个网页文件index.html。

启动jwebserver。

浏览器访问:

浏览器访问测试

有请求时会在控制台输出请求信息:

通过help参数可以查看jwebserver支持的参数。

JEP 413:Javadoc中支持代码片段

在Java 18之前,已经支持在Javadoc中引入代码片段,但功能有限。现在Java 18优化了这个问题,增加了@snippet来引入更高级的代码片段。

在Java 18之前,使用{...}来引入代码片段。

生成Javadoc之后,效果如下:

Javadoc代码片段高亮代码片段

从Java 18开始,可以使用@snippet来生成注释,并可以高亮某个代码片段。

效果如下,更直观,效果更好。

Java 18 Javadoc

正则高亮代码片段

甚至可以使用正则来高亮某一段中的某些关键词:

生成的Javadoc效果如下:

替换代码片段

可以使用正则表达式来替换某一段代码。

这段注释会生成如下Javadoc效果。

附:Javadoc生成方式

访问测试:

JEP 416:使用方法句柄重新实现反射核心功能

Java 18改进了java.lang.reflect.Method、Constructor的实现逻辑,使之性能更好,速度更快。这项改动不会改动相关API,这意味着开发中不需要改动反射相关代码,就可以体验到性能更好的反射。

OpenJDK官方给出了新老实现的反射性能基准测试结果。

Java 18之前:

Java 18的新实现:

可以看到在某些场景下性能稍微好些。

JEP 417:Vector API(三次孵化)

在Java 16中引入了一个新的API来进行向量计算,它可以在运行时可靠地编译为支持的CPU架构,从而实现更优的计算能力。

在Java 17中改进了Vector API性能,增强了例如对字符的操作、字节向量与布尔数组之间的相互转换等功能。

现在在JDK 18中将继续优化其性能。

JEP 418:互联网地址解析SPI

对于互联网地址解析SPI,为主机地址和域名地址解析定义了一个SPI,以便java.net.InetAddress可以使用平台内置解析器以外的解析器。

JEP 419:Foreign Function & Memory API (第二次孵化)

新的API允许Java开发者与JVM之外的代码和数据交互,通过调用外部函数,可以在不使用JNI的情况下调用本地库。

这是一个孵化功能;需要添加--add-modules jdk.incubator.foreign来编译和运行Java代码,Java 18改进了相关API,使之更加简单易用。

历史JEP 420:switch表达式(二次孵化)

从Java 17开始,对Switch的改进已经在进行中,Java 17的JEP 406已经对Switch表达式进行了增强,使之可以减少代码量。

下面是几个例子:

而在Java 17之后,可以通过下面的写法进行改进:

switch可以和null进行结合判断:

case时可以加入复杂表达式:

case时可以进行类型判断:

扩展:JEP 406:Switch的类型匹配(预览)[15]

JEP 421:弃用删除相关

在未来将删除Finalization,目前Finalization仍默认保持启用状态,但已经可以手动禁用;在未来的版本中,将会默认禁用;在以后的版本中,它将被删除。需要进行资源管理可以尝试try-with-resources或者java.lang.ref.Cleaner。