JDK18特性

news2024/11/14 6:32:56

文章目录

  • JAVA18概述
  • 1. 默认UTF-8字符编码
  • 2. 简单的Web服务器
  • 3.JavaDoc的增强
  • 4. 反射功能的新特性
  • 5.Vector API(三次孵化)
  • 6. 互联网地址解析SPI
  • 7. 外部函数和内存API(二次孵化)
  • 8.switch 表达式

在这里插入图片描述

JAVA18概述

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

官方地址

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

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

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 表达式进行了增强,使之可以减少代码量。

下面是几个例子:

// 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/1019507.html

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

相关文章

简单的手机电脑无线传输方案(android@windows)

文章目录 abstractwindows浏览android文件环境准备客户端软件无线网络链接步骤其他方法 手机浏览电脑文件公网局域网everythingpython http.server abstract windows访问android文件 android访问桌面系统上的文件 windows浏览android文件 环境准备 客户端软件 android手机…

引导加载程序

引导加载程序概览 引导加载程序是供应商专有的映像,负责在设备上启动内核。引导加载程序会监护设备状态,负责初始化可信执行环境 (TEE) 以及绑定其信任根。引导加载程序还会在将执行工作移到内核之前先验证 boot 和 recovery 分区的完整性。 引导加载程…

京都大学利用 CNN 预测粮食产量,丰收不问天,问 AI 就够了

联合国预测,2050 年世界人口预计达到 91 亿,全球对粮食的需求量将增加 70%。然而,由于世界农业发展不均衡,很多地区的粮食产量尚无法被准确统计,因此无法对这些区域的农业发展做出合理规划。现有的粮食产量统计方法则难…

项目进度管理(3-3)PERT计划评审技术 理论和实践详解

1 计划评审技术起源 PERT(Program Evaluation and Review Technique,项目评估和审查技术)的起源可以追溯到20世纪50年代,与美国国防部和美国海军的项目管理有关。 PERT的发展始于20世纪50年代初,当时美国国防部正面临…

苹果笔不用原装可以吗?好用的平板触控笔

由于Apple pencil的出世,给许多小伙伴带了很高的生产效率。但Apple pencil的昂贵,让许多小伙伴连连劝退,觉得只是偶尔写字,没有必要入手一支这么昂贵的笔,咱们国内也会很多做得相当不错的平替电容笔,但很多…

java反序列化---URLDNS链

目录 一、前言 二、原理分析 三、代码实现 一、前言 URLDNS链相较于其他java反序列化链是比较简单的,只需要几步调用就能触发 所以学习java反序列化,最好从URLDNS链出发,初步了解如何跟进,以及反射获取类、方法等 使用这条链…

『PyQt5-Qt Designer篇』| 10 Qt Designer中控件的尺寸相关设置(sizePolicy策略)

10 Qt Designer中控件的尺寸相关设置(sizePolicy策略) 1 设置控件尺寸1.1 查看最大和最小尺寸1.2 设置最大和最小尺寸2 期望尺寸2.1 期望尺寸2.2 获取期望尺寸3 sizePolicy(尺寸策略)3.1 简介3.2 属性值4 示例1 设置控件尺寸 1.1 查看最大和最小尺寸 默认情况下控件的最大值…

Java集合之HashSet接口

Set Set接口、HashSet类、TreeSet类 Set(组、集):表示无序,元素不能重复的集合,组中的元素必须唯一 Set接口 Set接口定义了组/集/集合(Set)。他扩展了Collection接口,并声明了不允…

华为OD机试 - 分苹果 - 二进制(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明核心算法:按照二进制加法计算,并且不计算进位。但是,B希望在满足A的情况下获取苹果重量最多。 华为OD机试 2023B卷题库疯狂…

企业架构LNMP学习笔记51

企业案例使用: 主从模式: 缓存集群结构示意图: 去实现Redis的业务分离: 读的请求分配到从服务器上,写的请求分配到主服务器上。 Redis是没有中间件来进行分离的。 是通过业务代码直接来进行读写分离。 准备两台虚…

wordpress使用category order and taxonomy terms order插件实现分类目录的拖拽排序

文章目录 引入实现效果安装插件使用插件 引入 使用docker快速搭建wordpress服务,并指定域名访问 上一节我们使用docker快速搭建了wordpress服务,可以看到基础的wordpress服务已经集成基础的用户管理、文章发布、页面编辑、文章分类等功能,但…

某验3空间推理验证码破解

geetest极验空间推理验证码破解 > 本篇文章仅供学习使用,如侵权请联系删除。某验验证码3代,4代已经是老生常谈的问题了,本篇文章粗略的分析一波3代空间推理验证码识别与验证的整个过程。 yolov识别坐标 1.参数破解 从一开始gt和challen…

【Django】掌握models.py模型文件的使用

原文作者:我辈李想 版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、models类继承(一)创建apps文件夹(二)settings.py文件配置(三)…

python连接mysql数据库报错pymysql.err.OperationalError

报错如下: 历史工程使用的是python3.6pymysqlmysql8.0 原因分析: 1、可能密码错误,通过navicat可以正常连接, 可排除 2、可能新版mysql默认使用的caching_sha2_password认证方式,换成mysql_native_password就可以 解决方法&am…

【今日话题】如何看待Unity收费一事,对标中小公司的从业者的该如何做

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

nowcoder NC30 缺失的第一个正整数

目录 题目描述: 分析: 完整代码: 题目链接: https://www.nowcoder.com/share/jump/819478881694767416272 题目描述: 给定一个无重复元素的整数数组nums,请你找出其中没有出现的最小的正整数 进阶&am…

常用电压基准芯片SC431BVSNT1G 应用及介绍

SC431BVSNT1G安森美深力科一款集成电路为三端子可编程并联调节二极管。这些单片IC电压参考作为低温系数齐纳工作可使用两个外部电阻器从Vref编程到36V。工作电流范围很宽,从40 a到100 mA典型的动态阻抗为0.22,2.5 V参考电压便于获得来自5.0 V逻辑电源的稳…

Python爆破shadow文件密码

原理 加密算法(明文,盐值) 密文 上面是shadow文件中密码的加密公式,我们可以用Python中的crypt()函数进行上述运算,如果得出的密文与原来的一致,说明密码爆破成功。 关于盐值和shadow文件的字段详解,请移步我的这篇博…

Vue-01:MVVM数据双向绑定与Vue的生命周期

一、Vue介绍 1.1 什么是Vue ? Vue是一个渐进式的JavaScript框架,用于构建用户界面。"渐进式"意味着Vue的设计理念是逐步增强应用的功能和复杂性,而不是一次性地引入所有功能。这使得开发者可以根据项目需求选择性地使用Vue的不同特…

Rocketmq并发和顺序消费的失败重试机制

文章目录 问题并发消费触发时机客户端发起请求 CONSUMER_SEND_MSG_BACKBroker处理CONSUMER_SEND_MSG_BACK请求 顺序消费Q&A消费的时候是一批的消息, 如果其中某条消费失败了,是所有的消息都会被重试吗?用户可以自己控制重试次数、重试间隔时间吗?批量消费消息,…