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

news2025/1/16 3:40:18

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

在这里插入图片描述

一、JAVA18概述

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

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

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

然后启动 jwebserver:

image.png

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

image.png

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

image.png

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

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

image.png

image.png

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

image.png

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

image.png

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

image.png

image.png

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

image.png

3.JavaDoc的增强

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

/**
 * 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文档

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

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

image.png

image.png

image.png

4. 反射功能的新特性

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

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

image.png

5.Vector API(三次孵化)

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

6. 互联网地址解析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());
    }

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

下面是几个例子:

// 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 之后,可以通过下面的写法进行改进

// 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 进行结合判断:

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 时可以加入复杂表达式:

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 时可以进行类型判断

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;
    };
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAP ABAP——SAP简介(四)【SAP GUI】

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后…

Docker学习笔记——收藏

Docker 命令;Docker进程相关命令;Docker 镜像相关命令;Docker 容器数据卷;Docker 应用部署案例;Dockerfile;Docker 私有仓库搭建;笔记 目录 初始Docker 安装Docker Docker 架构 Docker 命令 …

圣诞也要撸代码 |【消息中间件MQ系列】Spring整合kafka并设置多套kafka配置

1、前言 圣诞节的到来,程序员不会收到圣诞老人的🎁,但可以自己满足一下自己,所以,趁着有时间,就记录一下这会儿撸了些什么代码吧!!! 因为业务原因,需要在系统…

事务日志undo log

事务日志undo log 1 Undo日志的作用 作用1:回滚数据 逻辑上恢复,之前插入了一条数据,已经开辟了物理空间,回滚只是将该数据删除,物理空间还存在。 作用2:MVCC 2 Undo存储结构 mysql> show variables …

java生成SSL证书并添加信任,tomcat配置https访问并解决扫描漏洞问题

一、java生成keystore密钥对 1、打开jdk的bin目录,使用keytool工具生成keystore密钥对 Keytool 是一个 Java 数据证书的管理工具 ,Keytool 将密钥(key)和证书(certificates)存储于一个称为 keystore 的密…

某车企用户数据泄露,新能源汽车信息安全问题不容忽视

某车企:公司核心数据被窃取 12月20日,国内某新能源汽车发布相关声明称,2022年12月11日,其收到外部邮件,声称拥有该车企内部数据,并以泄露数据勒索225万美元等额比特币(约合1570.5万元人民币&am…

FFmpeg学习笔记--Ubuntu20.04编译安装FFmpeg、FFplay和FFprobe

目录 1--下载FFmpeg 2--编译FFmpeg 3--设置环境变量 4--测试 1--下载FFmpeg ① 下载 5.1 版本的 ffmpeg wget http://www.ffmpeg.org/releases/ffmpeg-5.1.tar.gz ② 解压下载的压缩包 tar -zxvf ffmpeg-5.1.tar.gz 2--编译FFmpeg ① 进入解压后的文件夹 cd ffmpeg-5…

基于JAVA Spring Boot高颜值的教学管理平台(含小程序),提供权限管理、考试、问卷、练习、在线学习等功能

Welcome to sg-exam-next 👋 硕果云,基于Spring Boot搭建的方便易用、高颜值的教学管理平台,提供权限管理、考试、问卷、练习等功能 主要功能为在线学习、考试、练习 课程内容支持图文、视频,考试类型支持考试、练习、问卷 题型支…

Android插件化技术——【class学习】

class 文件的定义 class 文件就是能够被 JVM 识别,加载并且执行的文件格式。从定义来看,class 文件没有想象中的那么神秘,和其他格式如 txt,mp4 一样,只是一种文件格式,它存储的是我们应用程序。 不止 Ja…

matlab/simulink中关于如何使得信号FFT和IFFT前后功率保持一致

快速傅里叶变换FFT其实是一种对离散傅里叶变换DFT的快速算法 为了便于公式推导和理解,本文从DFT的公式出发进行解释,在帕萨瓦尔定律的条件下,探究如何保证FFT/IFFT前后信号功率保持一致。 目录模型假设FFT前后功率保持一致IFFT前后功率保持一…

Bluetooth LE相关学习笔记

The Bluetooth LE Specifications The Bluetooth Core Specification 核心规范适用于 Bluetooth LE和Bluetooth Classic,它定义了蓝牙的体系结构及其层次,描述和定义了蓝牙的关键特性,定义了设备在协议栈的特定层上进行重要操作的方法和通信…

【圣诞限定】2022的末尾,送TA一颗圣诞树吧

2022年圣诞节,很高兴能遇见你。 一、前言 不知不觉又到年末啦,今年遇到了超级超级棒的人,希望能跟他一起做很多很多事,完成很多很多未完成的心愿。既然是圣诞节限定,那就送他一颗圣诞树吧🎄天天开心&#…

开发者百宝箱——DevToys

开发者百宝箱——DevToys 文章目录 简介安装转换类型编码/解码格式化生成器文本处理图片设置参考文献 简介 DevToys 是一个开发人员的工具箱,基于 UWP 开发,免费开源无广告,支持中文,功能有: 转换类型 JSON / YAML…

【C语言进阶】指针的进阶

在初级阶段的《指针》章节已经接触过了,我们知道了指针的概念: 1. 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。 2. 指针的大小是固定的4/8个字节(32位平台/64位平台)。 3. 指针是有类型&#…

Word处理控件Aspose.Words功能演示:使用 C# 将 PowerPoint 演示文稿转换为 Word 文档

Aspose.Words 是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word。此外, Aspose API支持流行文件格式处…

Android自动化打包记录--Jenkins+Docker+WSL2

Android自动化打包记录--JenkinsDockerWSL2前言自动化流程测试环境生产环境自动化原理Windows下安装Ubuntu安装步骤相关error处理error: 0x8007019eerror: 0x800701bc、0x80370102WSL访问WindowsWSL访问内网Ubuntu下Docker内容安装运行HelloWorld拉取镜像镜像和容器命令创建镜像…

你不一定了解MySQL中的Decimal数据类型

一、前言 在此之前笔者写过一篇博客《你说精通MySQL其实很菜jī(1):你不一定会的基本技巧或知识点(值得一看)》,本文内容是从那篇博客截取出来的。MySQL中Decimal数据类型大家经常使用到,但是&a…

从零了解多线程(万字详解)

目录 为什么要引入多线程? 为什么线程更轻? 线程和进程的关系 多线程的弊端 Thread类 用Thread类创建一个线程并启动它 用一段通过多线程体现并发执行的效果 start和run的区别 使用jdl自带的工具包jconsole查看当前java进程中的所有线程 调用栈 注意: jave中创建线…

Duplicate File Finder Pro - 重复文件查找器,给你的 Mac 清理出大量磁盘空间

Duplicate File Finder Pro - 重复文件查找器,给你的 Mac 清理出大量磁盘空间 重复文件查找器 Duplicate File Finder Pro 是一个实用程序,只需3次点击就能在Mac上找到重复的文件。拖放功能和尽可能多的文件夹,你想,然后按下扫描按…

理解Linux中的进程状态

文章目录运行状态阻塞状态挂起状态磁盘睡眠状态暂停状态追踪停止状态僵尸状态死亡状态孤儿状态Linux内核进程状态源代码一台电脑一般只有一个CPU、一个磁盘(无论一台电脑有几个CPU、磁盘,数量都是远少于进程的,这里举例用一个)。运…