JDK21你可以不用,新特性还是要了解的

2023-09-22 09:52:57

大家好,我是风筝

今年6月份的时候,写过一篇JDK21引入协程,再也不用为并发而头疼了,那时候只是预览版,终于,前两天(2023年9月19日)发布了 JDK21 正式版。

老早就在 YouTube 上订阅了 JDK21 发布会的直播,一场预计历时 8 个小时的直播。

Spring Boot 3.x 版本最低支持的 JDK 版本为 JDK 17,也就是说如果你还想用 JDK8的话,那能用的最高 Spring Boot 版本为 2.7。

Dubbo 在官方说明中也已经将 JDK 17 作为推荐的版本了。其他的几乎你所能用到的一些开源框架或工具包都早已支持最起码 JDK 17 了。JDK 8 不知道还能坚持多久。

JDK21是 LTS(长期支持版),至此为止,目前有 JDK8、JDK11、JDK17和 JDK21这四个长期支持版了。相信用不了多久,JDK21就会取代JDK17的位置,因为 JDK21在 JDK17的基础上做了向上增强。

下载 JDK 21

现在你打开 OpenJDK 官网,已经可以下载了,下载地址:https://jdk.java.net/21/,我已经把之前的预览版删掉,换成正式版了。

不管你工作上用的 JDK版本是不是 1.8,都可以下载下来尝试一下,早点熟悉、早点适应,早晚会用上的。

打开官方 JDK21的项目页,可以在 Features 列表看到新增的功能,带 Preview 样式的是预览功能,也就是非正式功能。

没想到 String Templates(字符串模板)和 Structured Concurrency(结构化并发)还是预览版。

序列化集合接口

新增了序列集合接口 SequencedCollection,我们常用的 ArrayListLinkedList等都实现了这个接口。

public interface SequencedCollection<E> extends Collection<E> {
 
    SequencedCollection<E> reversed();

    default void addFirst(E e) {
        throw new UnsupportedOperationException();
    }

    default E getFirst() {
        return this.iterator().next();
    }
  
    default E getLast() {
        return this.reversed().iterator().next();
    }

    default E removeLast() {
        var it = this.reversed().iterator();
        E e = it.next();
        it.remove();
        return e;
    }
}

可以方便的获取第一个、最后一个元素、移除最后一个元素、在头部插入元素。

List<Integer> integerList = List.of(1,2,3);
// 翻转列表
List<Integer> reversed = integerList.reversed();
reversed.forEach(System.out::println);
// 获取第一个元素
Integer first = integerList.getFirst();

之前获取第一个元素是 list.get(0),现在用 list.getFirst()就可以了。

这个功能只能算是锦上添花的功能吧,并么有比之前方便多少。

ZGC 增加分代

可能很多人对 JVM 垃圾收集器的最新款还停留在 G1上。ZGC 是在 JDK11中推出的,ZGC是低延迟垃圾收集器,几乎是全并发,停顿时间不超过10ms。

JDK21中对 ZGC 进行了功能扩展,增加了分代功能,比如 CMS 收集器区分老年代和年轻代,这样一来,可以更频繁的回收年轻代。

要使用 ZGC 以及分代功能,需要加入下面的参数。

-XX:+UseZGC -XX:+ZGenerational

Record 匹配模式

我们先声明一个 Record

record Person(String name, int age) {}

在 JDK21之前,我们要用 instanceof 判断一个对象,并取出对象的字段时,会这样做。

Person p = new Person("John", 25);
if(p instanceof Person) {
    System.out.println("Name: " + p.name);
}

现在可以这样了,直接将参数带着,然后自动解析出参数在实体中的具体值。

Person p = new Person("John", 25);
// 可以直接解构记录字段
if(p instanceof Person(String name, int age)) {
    System.out.println("Name: " + name);
}
// 或者
switch (p) {
    case Person(String n, int a) -> {
        System.out.println("Name: " + n + ", Age: " + a);
    }
}

switch 增强

不多说,就看看下面这个方法,可以直接根据参数类型进行匹配

static String switchObject(Object obj) {
   return switch (obj) {
        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 -> obj.toString();
    };
}

我们调用上面的方法

var strObj = "字符串";
var intObj = 1;
var doubleObj = 8.88D;
System.out.println(switchObject(strObj));
System.out.println(switchObject(intObj));
System.out.println(switchObject(doubleObj));

得到的输出内容为:

String 字符串
int 1
double 8.880000

还有更多的模式等待探索。

虚拟线程(Virtual Threads)

虚拟线程是基于协程的线程,它们与其他语言中的协程具有相似之处,但也存在一些不同之处。

虚拟线程是依附于主线程的,如果主线程销毁了,那虚拟线程也不复存在。

相同之处:

  1. 虚拟线程和协程都是轻量级的线程,它们的创建和销毁的开销都比传统的操作系统线程要小。
  2. 虚拟线程和协程都可以通过暂停和恢复来实现线程之间的切换,从而避免了线程上下文切换的开销。
  3. 虚拟线程和协程都可以使用异步和非阻塞的方式来处理任务,提高应用程序的性能和响应速度。

不同之处:

  1. 虚拟线程是在 JVM 层面实现的,而协程则是在语言层面实现的。因此,虚拟线程的实现可以与任何支持 JVM 的语言一起使用,而协程的实现则需要特定的编程语言支持。
  2. 虚拟线程是一种基于线程的协程实现,因此它们可以使用线程相关的 API,如 ThreadLocalLockSemaphore。而协程则不依赖于线程,通常需要使用特定的异步编程框架和 API。
  3. 虚拟线程的调度是由 JVM 管理的,而协程的调度是由编程语言或异步编程框架管理的。因此,虚拟线程可以更好地与其他线程进行协作,而协程则更适合处理异步任务。

具体的使用可以参考这篇文章 JDK21引入协程,再也不用为并发而头疼了

Key Encapsulation Mechanism API

提供一套非对称加密的API。使应用程序能够使用 KEM 算法,例如 RSA 密钥封装机制 (RSA-KEM)、椭圆曲线集成加密方案 (ECIES) 以及美国国家标准与技术研究院 (NIST) 后量子加密标准化过程的候选 KEM 算法。

我们如果用 Java 8 的话,涉及到加密算法的部分几乎都是用的第三方加密,那升级了 JDK21之后,就不用使用第三方包了。

在线 Java 编码平台

https://dev.java/playground/,写一些简单的测试还是可以的,而且上面提供了JDK21中的一些新特性 Demo。

下面是我的测试代码,可以正常运行,但是不支持中文。

最后

不管怎么升级,还是有很多公司、很多人会持续用 Java 8的,毕竟技术服务于业务,业务稳定才是根本。

应该很快从 Java 8 升级到更高版本的团队和个人会越来越多,毕竟相比 8 而言,新版本有了更多的新特性,支持的场景更多,而且性能也更好了。

有没有用高于 Java 8 版本的同学,上来举个手。

更多推荐

【第四阶段】kotlin语言的Map集合学习

1.Map集合的创建packageKotlin.Stage4funmain(){valmap=mapOf("java"to1,"kotlin"to2)//java代表键1代表值valmap2=mapOf(Pair("java",1),Pair("kotlin",2))//和上面写法等价}2.读取map的值方式1:使用[

多输入多输出 | MATLAB实现LSSVM最小二乘支持向量机多输入多输出

多输入多输出|MATLAB实现LSSVM最小二乘支持向量机多输入多输出目录多输入多输出|MATLAB实现LSSVM最小二乘支持向量机多输入多输出预测效果基本介绍程序设计往期精彩参考资料预测效果基本介绍MATLAB实现LSSVM最小二乘支持向量机多输入多输出1.data为数据集,10个输入特征,3个输出变量。2.main

安防监控视频系统EasyCVR+AI算法智能分析网关助力智慧校园建设

学生是祖国的未来,学校就是培育学生的地方。随着校园信息化建设的不断发展,信息服务在校园管理中的作用也越来越强。在保障学生安全与校园高效管理上,人工智能做出了极大贡献,旭帆科技安防监控系统/视频汇聚/云存储/AI智能视频分析平台EasyCVR基于互联网、大数据、云计算的智慧管理,为提高校园监管标准,推进学校信息化建设,打

redis桌面连接工具Another Redis Desktop Manager使用介绍

AnotherRedisDesktopManager是一种类似于navicat的数据库连接工具,专门用来连接redis,使用起来非常简单方便,在这里推荐给大家。没有用过这个软件的,首先通过下面的网盘链接下载AnotherRedisDesktopManager百度网盘redis下载地址https://pan.baidu.

基于图的基础推荐方式

文章目录1.基于图的基础推荐方式1.1链路预测(LinkPrediction)1.2什么是路径1.3基于路径的基础链路预测1.4图游走算法DeepWalk1.4.1Word2Vec1.4.2DeepWalk原理1.4.3DeepWalk代码示例1.5图游走算法Node2Vec1.5.1Node2Vec原理1.5.2No

视频编辑SDK:轻松打造专业级视频处理能力

视频编辑SDK是一款强大的技术工具,可以帮助开发者轻松实现视频剪辑、特效处理等功能。美摄科技作为业内知名的视频技术公司,其视频编辑SDK凭借独特的功能和易用性,受到了广大开发者的欢迎。美摄科技的视频编辑SDK支持多种视频格式导入,可实现视频剪辑、拼接、变速、调色等基本功能。同时,它还提供了丰富的特效插件,如文字、滤镜、

python基础

一,什么是pythonPython是一种高级、通用且解释型的编程语言,由GuidovanRossum于1991年首次发布。它具有简洁的语法、清晰的代码结构和强大的功能,被广泛应用于各种领域,包括软件开发、数据分析、人工智能、网络编程等。以下是Python的一些特点和优势:简单易学:Python具有直观、简洁的语法,易于

GDPU 数据结构 天码行空2

实验内容用顺序表实现病历信息的管理与查询功能。具体要求如下:利用教材中定义顺序表类型存储病人病历信息(病历号,姓名,症状);要求使用头文件。设计顺序表定位查找算法,写成一个函数,完成的功能为:在线性表L中查找数据元素x,如果存在则返回线性表中和x值相等的第1个数据元素的序号;如果不存在,则返回-1。函数定义为intLi

数据结构之-----二叉树

目录本章内容如下:1:树的相关概念与结构2:二叉树的概念与结构3:二叉树的链式结构与实现文章正式开始,让我们一起学习树吧!!一:树的概念树是一种非线性结构,与我们前面所学的顺序表与链表不同,数据元素的对应是1对多的关系,只有一个根结点,且除了根节点其它的结点有且仅有1个前驱结点(父结点)。我们可以将一棵树看作由很多个结

计算机和编程语言初见

学习程序设计的目的是什么呢?不一定要做出一个软件或系统出来,更重要的是理解计算机是如何工作的以及它的长处和短处。计算机本身是无意识的,因此我们要求它为我们做事时:应该将步骤细化、“直”化(规律化);其实计算机什么也不会,我们必须手把手地教他一步一步的做。而计算机的某个优点也正是如此——听话,你叫它往东它绝不往西。然后我

Stellar Toolkit for MySQL 9.0 Crack 3in1

面向数据库管理员的MySQL工具包StellarToolkitforMySQL是一款三合一软件套件,用于修复损坏的MySQL和MariaDB数据库、从MySQL数据库的InnoDB和MyISAM表恢复数据以及分析MySQL数据库日志文件。该软件还可以以最高的安全性和完整性相互转换MySQL/MariaDB、MSSQL(

热文推荐