2022年3月,Oracle正式发布了Java 18,这是Java长期支持版本(LTS)Java 17之后的首个重要更新。虽然不像LTS版本那样引人注目,但Java 18仍然带来了多项值得开发者关注的改进和新特性。本文将深入剖析Java 18的七大JEP(Java Enhancement Proposal)特性,帮助开发者全面了解这次更新的技术细节和实际应用价值。
一、JEP 400:UTF-8成为默认字符集
Java 18最基础但也最重要的变化就是将UTF-8指定为Java平台的默认字符集。在此之前,Java默认字符集取决于操作系统和区域设置,这常常导致跨平台兼容性问题。
-
技术背景
在Windows英文系统中,默认字符集通常是Windows-1252;在Linux系统上可能是US-ASCII或ISO-8859-1。这种不一致性经常导致文件读取、网络传输等场景下的乱码问题。 -
实际影响
现在,以下API将默认使用UTF-8: - java.io.FileReader/FileWriter
- java.nio.file.Files的newBufferedReader/newBufferedWriter方法
- Formatter和Scanner构造方法
-
URLEncoder和URLDecoder的静态方法
-
兼容性考虑
如需保持旧版行为,可通过系统属性file.encoding指定其他字符集。例如:
java -Dfile.encoding=ISO-8859-1 MyApp
二、JEP 408:简易Web服务器
Java 18引入了一个命令行工具和API来启动一个最小化的Web服务器,非常适合快速原型开发和测试。
- 基本用法
在命令行中直接运行:
jwebserver
默认会在localhost:8000启动服务,提供当前目录的文件服务。可通过参数自定义:
- -p 指定端口
- -b 绑定地址
- -d 设置目录
- -o 启用目录列表
- 编程方式使用
通过SimpleFileServer类创建自定义服务器:
var server = SimpleFileServer.createFileServer(
new InetSocketAddress(8080),
Path.of("./public"),
OutputLevel.VERBOSE);
server.start();
三、JEP 413:代码片段中的Javadoc
这项改进增强了Javadoc的@snippet标签,使API文档中可以包含可执行的代码示例。
- 基本语法
/** - 示例用法:
- {@snippet :
- List
list = new ArrayList<>(); - list.add("Hello");
- System.out.println(list.get(0)); // @highlight substring="println"
-
}
*/ -
高级功能
- @highlight:高亮特定代码部分
- @replace:替换示例中的文本
- @link:创建到其他文档的链接
- @start/end region:标记可折叠区域
四、JEP 416:使用方法句柄重新实现核心反射
这个JEP使用java.lang.invoke方法句柄重新实现了java.lang.reflect.Method、Constructor和Field的核心功能。
-
性能提升
新的实现在反射操作上平均有43-57%的性能提升,特别是在频繁调用的场景下。 -
内存占用
方法句柄的实现减少了内存占用,特别是当大量反射对象被创建时。 -
维护性
新的实现更简单,减少了维护成本,同时为未来可能的特性(如值类型)做好准备。
五、JEP 417:Vector API(第三次孵化)
Vector API进入了第三个孵化阶段,继续优化其在SIMD(单指令多数据)硬件上的性能表现。
- 新增功能
- 支持字符操作(CharVector)
- 改进内存访问性能
-
增强与Java Streams的互操作性
-
示例代码
var a = IntVector.fromArray(IntVector.SPECIES_256, arrayA, 0);
var b = IntVector.fromArray(IntVector.SPECIES_256, arrayB, 0);
var c = a.mul(b).add(b);
c.intoArray(result, 0);
六、JEP 418:互联网地址解析SPI
这个JEP为主机名和地址解析定义了服务提供者接口(SPI),允许开发者自定义InetAddress解析逻辑。
- 使用场景
- 自定义DNS解析
- 测试环境模拟
-
特殊网络配置
-
实现示例
public class MyResolverProvider extends InetAddressResolverProvider {
@Override
public InetAddressResolver get(Configuration configuration) {
return new CustomResolver();
}
}
七、JEP 419:Foreign Function & Memory API(第二次孵化)
替代JNI的Foreign Function & Memory API进入了第二个孵化阶段,改进了内存访问安全性。
- 主要改进
- 新的MemorySegment和MemoryAddress抽象
- 改进的内存分配器
-
更安全的资源释放机制
-
示例代码
try (ResourceScope scope = ResourceScope.newConfinedScope()) {
MemorySegment segment = MemorySegment.allocateNative(100, scope);
segment.asByteBuffer().putInt(0, 42);
}
Java 18升级建议
虽然Java 18不是LTS版本,但其中的多项特性值得关注:
1. 对于新项目,建议直接采用Java 18
2. 现有项目可评估UTF-8默认字符集的影响
3. 关注Vector API和Foreign API的演进,为未来性能优化做准备
4. 利用简易Web服务器简化开发和测试流程
结语
Java 18延续了Java平台每六个月发布一次的节奏,虽然功能上不如LTS版本重大,但仍然带来了多项实用改进。特别是UTF-8默认字符集的标准化,解决了长期存在的跨平台问题。简易Web服务器和增强的Javadoc功能则直接提升了开发体验。随着Java的持续演进,开发者可以期待更高效、更安全的编程体验。
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。