Java新特性梳理——Java18

812 阅读3分钟

ChatGPT Image 2026年1月9日 11_34_02.png

概述

Java 18 在 2022 年 3 月 22 日正式发布,Java 18 不是一个长期支持版本,这次更新共带来 9 个新功能。

默认的UTF-8字符编码

JDK 一直都是支持 UTF-8 字符编码,这次是把 UTF-8 设置为了默认编码,也就是在不加任何指定的情况下,默认所有需要用到编码的 JDK API 都使用 UTF-8 编码,这样就可以避免因为不同系统,不同地区,不同环境之间产生的编码问题。

简单的Web服务器

在 JDK 18 中提供一个简单的 Web 服务。也就是在 bin 目录下提供了一个 jwebserver 的命令。运行这个命令可以启动一个简单的、最小的静态 Web 服务器。它不支持 CGI 和 Servlet,所以最好的使用场景是用来测试、教育、演示等需求。

image.png

然后可以双击启动:

image.png

启动成功:http://127.0.0.1:8000

JavaDoc的增强

在 Java 18 中新增了对 Java Doc 的增强,在之前的版本虽然已经提供了在 Java Doc 中添加代码片段,但是对高亮处理没有提供支持。在 Java 18 中提供了功能:

/**
 * JavaDoc特性讲解
 *  {@snippet :
 *      if(v.isPresent()){
 *          System.out.println("Hello ... ")
 *      }
 *  }
 */
public class Test01 {

    /**
     * 正则高亮:
     * {@snippet :
     *   public static void main(String... args) {
     *       for (var arg : args) {                 // @highlight region regex = "\barg\b"
     *           if (!arg.isBlank()) {
     *               System.out.println(arg);
     *           }
     *       }                                      // @end
     *      }
     *   }
     */
    public static void main(String[] args) {
        System.out.println(Charset.defaultCharset());
        System.out.println("波哥....");
    }

    /**
     * 两数求和:
     * {@snippet :
     *   public Integer add(int a,int b){
     *      System.out.println("add ..."); // @replace regex='".*"' replacement="..."
     *      return a + b;
     *   }
     * }
     */
    public Integer add(int a,int b){
        System.out.println("add ...");
        return a + b ;
    }
}

生成 doc 文档:

javadoc.exe -public -sourcepath ./src -subpackages com -encoding utf-8 -charset utf-8 -d ./javadocout

反射功能的新特性

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

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

image.png

Vector API(三次孵化)

在 Java 16 中引入一个新的 API 来进行向量计算,它可以在运行时可靠的编译为支持的 CPU 架构,从而实现更优的计算能力。在 Java 17 中改进了 Vector API 性能,增强了例如对字符的操作、字节向量与布尔数组之间的相互转换等功能。现在在 JDK 18 中将继续优化其性能。

互联网地址解析SPI

为主机名和地址解析定义服务提供者接口(SPI),以便 java.net.InetAddress 可以使用平台内置解析器以外的解析器。

public static void main(String[] args) throws Exception {
    InetAddress inetAddress = InetAddress.getByName("cart.msb.com");
    System.out.println(inetAddress.getHostAddress());
}

外部函数和内存API

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

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

switch表达式

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

注意这块的代码需要通过 2022 版的 IDEA 才支持。