前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK18特性讲解】

JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK18特性讲解】

作者头像
用户4919348
发布2022-12-28 15:07:04
1.3K0
发布2022-12-28 15:07:04
举报
文章被收录于专栏:波波烤鸭

JDK各个版本特性讲解-JDK18特性

在这里插入图片描述
在这里插入图片描述

一、JAVA18概述

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

https://openjdk.org/projects/jdk/18/

image.png
image.png

二、具体新特性

1. 默认UTF-8字符编码

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

2. 简单的Web服务器

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

image.png
image.png

然后启动 jwebserver:

image.png
image.png

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

image.png
image.png

cmd窗口出现乱码的情况。因为JAVA18默认编码为 UTF-8,但是在cmd中的默认编码为GBK。这时我们需要调整下。在cmd窗口输入 chcp

image.png
image.png

655001:代表UTF-8编码, 936 : 代表GBK编码。

我们临时修改就可以了。输入chcp 65001可以将当前窗口的编码形式修改为UTF-8

image.png
image.png
image.png
image.png

服务启动访问的是当前bin目录。我们可以在自己的项目中创建对应的index.html文件

image.png
image.png

然后我们可以看看帮助命令。怎么指定到特定的目录:

image.png
image.png

jwebserver -d E:\workspace\VipWorkSpace\JDKDemo03\src

image.png
image.png
image.png
image.png

有请求的时候控制台会有相关的输出信息

image.png
image.png

3.JavaDoc的增强

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

代码语言:javascript
复制
/**
 * 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文档

代码语言:javascript
复制
D:\software\openjdk-19.0.1_windows-x64_bin\jdk-19.0.1\bin\javadoc.exe -public -sourcepath ./src -subpackages com -encoding utf-8 -charset utf-8 -d ./javadocout
image.png
image.png

然后结合 jwebserver来查看发布的doc文档

image.png
image.png
image.png
image.png
image.png
image.png

4. 反射功能的新特性

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

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

image.png
image.png

5.Vector API(三次孵化)

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

6. 互联网地址解析SPI

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

代码语言:javascript
复制
    public static void main(String[] args) throws Exception {
        InetAddress inetAddress = InetAddress.getByName("cart.msb.com");
        System.out.println(inetAddress.getHostAddress());
    }

7. 外部函数和内存API(二次孵化)

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

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

8.switch 表达式

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

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

image.png
image.png

下面是几个例子:

代码语言:javascript
复制
// JDK 17 以前
static String formatter(Object o) {
    String formatted = "unknown";
    if (o instanceof Integer i) {
        formatted = String.format("int %d", i);
    } else if (o instanceof Long l) {
        formatted = String.format("long %d", l);
    } else if (o instanceof Double d) {
        formatted = String.format("double %f", d);
    } else if (o instanceof String s) {
        formatted = String.format("String %s", s);
    }
    return formatted;
}

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

代码语言:javascript
复制
// JDK 17 之后
static String formatterPatternSwitch(Object o) {
    return switch (o) {
        case Integer i -> String.format("int %d", i);
        case Long l    -> String.format("long %d", l);
        case Double d  -> String.format("double %f", d);
        case String s  -> String.format("String %s", s);
        default        -> o.toString();
    };
}

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

代码语言:javascript
复制
static void testFooBar(String s) {
    switch (s) {
        case null         -> System.out.println("Oops");
        case "Foo", "Bar" -> System.out.println("Great");
        default           -> System.out.println("Ok");
    }
}

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

代码语言:javascript
复制
static void testTriangle(Shape s) {
    switch (s) {
        case Triangle t && (t.calculateArea() > 100) ->
            System.out.println("Large triangle");
        default ->
            System.out.println("A shape, possibly a small triangle");
    }
}

case 时可以进行类型判断

代码语言:javascript
复制
sealed interface S permits A, B, C {}
final class A implements S {}
final class B implements S {}
record C(int i) implements S {}  // Implicitly final

static int testSealedExhaustive(S s) {
    return switch (s) {
        case A a -> 1;
        case B b -> 2;
        case C c -> 3;
    };
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • JDK各个版本特性讲解-JDK18特性
  • 一、JAVA18概述
  • 二、具体新特性
    • 1. 默认UTF-8字符编码
      • 2. 简单的Web服务器
        • 3.JavaDoc的增强
          • 4. 反射功能的新特性
            • 5.Vector API(三次孵化)
              • 6. 互联网地址解析SPI
                • 7. 外部函数和内存API(二次孵化)
                  • 8.switch 表达式
                  相关产品与服务
                  命令行工具
                  腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档