Java8加java10等于Java18的版本查看及特性详解

目录
  • 前言
    • JEP 400
    • JEP 408
    • JEP 413
    • JEP 417
    • JEP 418
    • JEP 419
    • JEP 420
    • JEP 421
  • 总结

前言

Java 18正式发布, 虽然它不是长期支持 (LTS) 版本,但它却实现了九个 JEP(在Java 18列出)。有哪些特性值得关注呢?

JEP 400

将 UTF-8 指定为标准 Java API 的默认字符集。通过此更改,依赖于默认字符集的 API 将在所有实现、操作系统、语言环境和配置中保持一致。

JEP 408

Java内部终于有原生的Web服务器了。但是请注意它没有可用的 CGI 或类似 Servlet 的功能。该工具可用于原型设计、临时编码和测试目的,尤其是在教育环境中。

它并不是Jetty、Apache Tomcat等产品的竞品,也无法而且不推荐在生产环境中使用。仅仅是提供一个命令行工具来辅助帮助开发人员设计、测试、教学。

JEP 413

支持在Java API文档中使用代码片段。以前在Java代码的注释中如果要写一些样例非常麻烦,甚至还要进行字符转义。现在Java注释引入了一个新的标记 @snippet 来解决注释中包含代码片段样例的问题。

它可以内联使用:

/**
 * The following code shows how to use {@code Optional.isPresent}:
 * {@snippet :
 * if (v.isPresent()) {
 *     System.out.println("v: " + v.get());
 * }
 * }
 */

也可以引用外部片段:

/**
 * The following code shows how to use {@code Optional.isPresent}:
 * {@snippet file="ShowOptional.java" region="example"}
 */

ShowOptional.java就是它引用的源代码:

public class ShowOptional {
    void show(Optional<String> v) {
        // @start region="example"
        if (v.isPresent()) {
            System.out.println("v: " + v.get());
        }
        // @end
    }
}

JEP 417

引入一个 API 来表达向量计算,该计算可以在运行时可靠地编译为支持的 CPU 架构上的最佳向量指令,从而实现优于等效标量计算的性能。 目前是第三次孵化。

JEP 418

为主机名和地址解析定义服务提供者接口 (SPI),以便java.net.InetAddress可以使用平台内置解析器以外的解析器。 这个对于互联网一些协议的接入提供了入口,同时你也可以对现有方案进行一些改进和定制。

JEP 419

Foreign Function & Memory API ( JEP 419 ) 是此版本中实现的更重要的 JEP 之一,因为它是Project Panama中包含的孵化组件之一。 Panama 正在简化将 Java 程序连接到非 Java 组件的过程。这一特殊功能在其第二次孵化迭代中引入了一个 API,Java 程序通过该 API 调用Native类库并处理Native数据。目的是取代设计的非常不理想的Java Native Interface (JNI)。

大家都知道其它语言有非常棒的一些类库,但是Java想调用其它语言的类库目前需要使用JNI。但是JNI被设计得太复杂了,让很多Java开发者难以上手。如果这一状况得到改变,那么利用Java去调用一些C或者C++音视频处理库和Python的机器学习库将是非常容易的事情。

JEP 420

实现的唯一真正影响 Java 语言的 JEP 是Pattern Matching for switch ( JEP 420 ),它在 Java 17 中首次预览(这是第二次预览)。其目的是“通过对switch 表达式和语句的模式匹配以及对模式语言的扩展来增强 Java 编程语言 。在 Java 16 中,JEP 394扩展了instanceof运算符以采用类型模式并执行模式匹配:

// Old code
if (o instanceof String) {
    String s = (String)o;
    ... use s ...
}

// New code
if (o instanceof String s) {
    ... use s ...
}

我们使用instanceof后无需再对对象进行类型转换就可以使用其真实的类型。

Java 14又引入了switch表达式:

int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY                -> 7;
    case THURSDAY, SATURDAY     -> 8;
    case WEDNESDAY              -> 9;
    default                     -> 11;
};

如果这两个能结合起来,switch能进行模式匹配的话,下面的句子将大大简化:

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

JEP 420的预览特性,将会把上面冗长的代码简化为:

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

是不是更加清晰了呢?

JEP 421

Object对象有一个finalize方法,该方法用于实例被垃圾回收器回收的时触发的操作。当 GC (垃圾回收器) 确定不存在对该对象的有更多引用时,对象的垃圾回收器就会调用这个方法。当时它的设计用来避免内存泄露,现在已经有了更好的替代方案try-with-resources和Java 9引入的 java.lang.ref.Cleaner 。

因此,所有该方法会被标记为过时,未来将被移除。

总结

很少有人在生产中使用 JDK 18,因为它不是 LTS 版本。去年九月发布JDK 17 LTS 版本更为重要,很多类库,特别是Spring framework 6.0和Spring Boot 3.0 都将基于JDK17,你还要在Java 8坚持多久呢?已经相差了10个版本了。下一个是LTS是 2023 年 9 月的 Java 21。

以上就是Java 8加java10等于Java18版本要点详解的详细内容,更多关于Java8java10等于Java18版本的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java8新特性 StreamAPI实例详解

    目录 Stream结果收集 结果收集到集合中 结果收集到数组中 对流中的数据做聚合计算 对流中数据做分组操作 对流中的数据做分区操作 对流中的数据做拼接 并行的Stream流 串行的Stream流 并行流 获取并行流 并行流操作 并行流和串行流对比 线程安全问题 Stream结果收集 面试官:说说你常用的StreamAPI. 结果收集到集合中 public static void main(String[] args){ // Stream<String> stream = Stream.of

  • Java8到Java19的一些变化分析详解

    目录 前言 Java 8 Java 9 Java 10 Java 11 Java 12 Java 13 Java 14 Java 15 Java 16 Java 17 Java 18 Java 19 总结 前言 Java 是一种流行的编程语言,在其整个历史中经历了许多变化和更新.在本文中,我们将了解从 Java 8 开始的每个 Java 版本中引入的一些关键特性. Java 8 Lambda 表达式:Java 8 引入了一个称为 lambda 表达式的新功能,它允许在 Java 中进行函数式编程

  • Java8新特性Optional类及新时间日期API示例详解

    目录 Optional类 以前对null的处理 Optional类介绍 Optional的基本使用 Optional的常用方法 新时间日期API 旧版日期时间的问题 新日期时间API介绍 日期时间的常见操作 日期时间的修改和比较 格式化和解析操作 Instant类 计算日期时间差 时间校正器 日期时间的时区 JDK新的日期和时间API的优势 Optional类 面试官:Optional类了解过吗? 这个Optional类主要是解决空指针的问题. 以前对null的处理 @Test public v

  • Java9新特性中的模块化详解

    目录 模块化是什么? 那么,模块化怎么用呢? 为什么要用模块化 显式管理依赖: 强封装性: 安全性: 规范性: 自定义最小运行时映像: 孵化器模块的支持: Java9中的一个重大特性是增加了一种新型的程序设计组件 - 模块. 官方对模块的定义为:一个被命名的,代码和数据的自描述集合.( the module, which is a named, self-describing collection of code and data). 这个在Java7的时候就已经被提出,但由于其复杂性,不断跳票

  • Java8 List集合如何移除满足条件的元素

    目录 Java8 List集合移除满足条件的元素 移除List集合中特定的元素 1.移除List<String>中指定元素 2.移除List<对象>中指定元素 总结 Java8 List集合移除满足条件的元素 list.removeIf(filter ->{     return containerList.contains(filter); }); 功能:移除list中已经在containerList 容器中存在的元素. 移除List集合中特定的元素 两种情况 1.移除Li

  • Java9新特性Module模块化编程示例演绎

    目录 一.什么是Javamodule? 二.模块导出package 三.模块导入package 四.Javamodule的意义 五.实例 第一个模块 第二个模块 尝试使用未被exports的package代码 我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 写成一系列的文章,大概十篇左右,本文是第8篇. 在Java 9版本中Java 语言引入了一

  • Java11 中基于嵌套关系的访问控制优化问题

    目录 Java11 之前的实现方式 技术债务 Java11 中的实现 Nestmate 新增的 API getNestHost getNestMembers isNestmateOf 后续的改进 你好,我是看山. Java 语言很强大,但是,有人的地方就有江湖,有猿的地方就有 bug,Java 的核心代码并非十全十美.比如在 JDK 中居然也有反模式接口常量 中介绍的反模式实现,以及本文说到的这个技术债务:嵌套关系(NestMate)调用方式. 在 Java 语言中,类和接口可以相互嵌套,这种组

  • Java8加java10等于Java18的版本查看及特性详解

    目录 前言 JEP 400 JEP 408 JEP 413 JEP 417 JEP 418 JEP 419 JEP 420 JEP 421 总结 前言 Java 18正式发布, 虽然它不是长期支持 (LTS) 版本,但它却实现了九个 JEP(在Java 18列出).有哪些特性值得关注呢? JEP 400 将 UTF-8 指定为标准 Java API 的默认字符集.通过此更改,依赖于默认字符集的 API 将在所有实现.操作系统.语言环境和配置中保持一致. JEP 408 Java内部终于有原生的W

  • linux yum安装指定版本mysql的教程详解

    1.下载mysql rpm包 cd /usr/local/src wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm 2.安装下载的rpm包 yum localinstall mysql80-community-release-el7-3.noarch.rpm 或 sudo rpm -Uvh mysql80-community-release-el6-n.noarch.rpm 3.查看yum存储库中的

  • Mysql Binlog数据查看的方法详解

    binlog介绍 binlog,即二进制日志,它记录了数据库上的所有改变. 改变数据库的SQL语句执行结束时,将在binlog的末尾写入一条记录,同时通知语句解析器,语句执行完毕. binlog格式 基于语句,无法保证所有语句都在从库执行成功,比如update ... limit 1; 基于行,将每一次改动记为binlog中的一行.在执行一个特别复杂的update或者delete操作时,基于行的格式会有优势. 登录到mysql查看binlog 只查看第一个binlog文件的内容 show bin

  • 2020最新版 PhpStudy V8.1版本下载安装使用详解

    最新版2020 PhpStudy V8.1的安装 一.从官网下载安装包并安装 PhpStudy v8.1下载官网 自己选择64位或者32位进行下载,下载之后默认安装 二.打开软件,开启Apache服务,并在浏览器输入本地地址(127.0.01)进行访问 Apache/Nginx是web的服务器 Mysql/MariaDB是数据库软件 Php是脚本开发语言 1.打开软件,对本机网站进行测试 在首页->套件位置启动Apache2.4.39(如果Apache版本是其他的也可以启动),启动之后会有一个绿

  • SpringBoot中对应2.0.x版本的Redis配置详解

    properties格式: # REDIS (RedisProperties) # Redis数据库索引(默认为0) spring.redis.database=0 # Redis服务器地址 spring.redis.host=localhost # Redis服务器连接端口 spring.redis.port=6379 # Redis服务器连接密码(默认为空) spring.redis.password= # 连接池最大连接数(使用负值表示没有限制) spring.redis.jedis.po

  • Android 通过网络图片路径查看图片实例详解

    Android 通过网络图片路径查看图片实例详解 1.在项目清单中添加网络访问权限 <!--访问网络的权限--> <uses-permission android:name="android.permission.INTERNET"/> 2.获取网络图片数据 /** * 获取网络图片的数据 * @param path 网络图片路径 * @return * @throws Exception */ public static byte[] getImage(Str

  • C#中调用DLL时未能加载文件或程序集错误的处理方法(详解)

    在加载DLL时,出现了如下的异常:未能加载文件或程序集"DMC3000, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"或它的某一个依赖项. 试图加载格式不正确的程序. 经上网查询后,其原因是x64和x86不兼容的问题.即DLL是x64的,但是VS默认生成的目标平台是x86的,因此,两者的不一致导致异常的出现. 其解决办法如下: 项目->属性->生成->目标平台->x64(与dll平台一致) 以上这篇

  • Linux 中(加、减、乘、除)实例详解

     Linux 中(加.减.乘.除)实例详解 实现代码: #!/bin/bash num1=10 num2=2 #两个数相加 add=$[$num1+$num2] echo $num1 + $num2 '=' $add #两个数相减 sub=$[$num1-$num2] echo $num1 - $num2 '=' $sub #两个数相乘 mut=$[$num1*$num2] echo $num1 '*' $num2 '=' $mut #两个数相除 div=$[$num1/$num2] echo

  • 微信浏览器禁止页面下拉查看网址实例详解

    微信浏览器禁止页面下拉查看网址实例详解 此类事件是手机touchmove默认事件行为,可以通过js代码隐藏事件: $('body').on('touchmove', function (event) {event.preventDefault();}); or document.addEventListener('touchmove', function(e){e.preventDefault()}, false); 但这样往往会把页面原生的scroll效果也一同去掉了,下面的代码可以完美解决这

  • MySQL 5.6.36 Windows x64位版本的安装教程详解

    1,目标环境 Windows 7 64位 2,材料 (1)VC++2010 发布包(64位) (2)MySQL 5.6.36 Windows x64位版本(非MSI,可从官网获取免费版本) (3)EditPlus(可选) 3,基础操作 本文中部分操作需以管理员身份+命令行进行执行. 4,步骤 (1)(解压到当前文件夹方式)解压安装包,编辑其中的my-default.ini文件,主要是2项: ①basedir即为mysql基础文件夹,形如:C:\mysql-5.6.36-winx64 ②datad

随机推荐