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

大家好,我是风筝

今年6月份的时候,写过一篇JDK21引入协程,再也不用为并发而头疼了[1],那时候只是预览版,终于,前两天(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 官网,已经可以下载了,下载地址:jdk.java.net/21/,我已经把之前的…[2]

不管你工作上用的 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引入协程,再也不用为并发而头疼了[3]

Key Encapsulation Mechanism API

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

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

在线 Java 编码平台

dev.java/playground/…[4] Demo。

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

最后

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

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

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

推荐阅读

什么时候都用微服务,只会害了你[5]

我的第一个 Chrome 插件上线了,欢迎试用![6]

前端同事最讨厌的后端行为,看看你中了没有[7]

参考资料

[1]

https://mp.weixin.qq.com/s?__biz=MzAxMjA0MDk2OA==&mid=2449471678&idx=1&sn=3ac6241cd22e99c7a84a05ad85618076&chksm=8fbcb6d9b8cb3fcf51ce0ad00b1ca6b0ded8e53c3945e4a5968641fa146e4d32917a844c661c&token=1079957065&lang=zh_CN#rd: https://link.juejin.cn/?target=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAxMjA0MDk2OA%3D%3D%26mid%3D2449471678%26idx%3D1%26sn%3D3ac6241cd22e99c7a84a05ad85618076%26chksm%3D8fbcb6d9b8cb3fcf51ce0ad00b1ca6b0ded8e53c3945e4a5968641fa146e4d32917a844c661c%26token%3D1079957065%26lang%3Dzh_CN%23rd

[2]

https://jdk.java.net/21/%EF%BC%8C%E6%88%91%E5%B7%B2%E7%BB%8F%E6%8A%8A%E4%B9%8B%E5%89%8D%E7%9A%84%E9%A2%84%E8%A7%88%E7%89%88%E5%88%A0%E6%8E%89%EF%BC%8C%E6%8D%A2%E6%88%90%E6%AD%A3%E5%BC%8F%E7%89%88%E4%BA%86%E3%80%82: https://link.juejin.cn/?target=https%3A%2F%2Fjdk.java.net%2F21%2F%25EF%25BC%258C%25E6%2588%2591%25E5%25B7%25B2%25E7%25BB%258F%25E6%258A%258A%25E4%25B9%258B%25E5%2589%258D%25E7%259A%2584%25E9%25A2%2584%25E8%25A7%2588%25E7%2589%2588%25E5%2588%25A0%25E6%258E%2589%25EF%25BC%258C%25E6%258D%25A2%25E6%2588%2590%25E6%25AD%25A3%25E5%25BC%258F%25E7%2589%2588%25E4%25BA%2586%25E3%2580%2582

[3]

https://mp.weixin.qq.com/s?__biz=MzAxMjA0MDk2OA==&mid=2449471678&idx=1&sn=3ac6241cd22e99c7a84a05ad85618076&chksm=8fbcb6d9b8cb3fcf51ce0ad00b1ca6b0ded8e53c3945e4a5968641fa146e4d32917a844c661c&token=1079957065&lang=zh_CN#rd: https://link.juejin.cn/?target=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAxMjA0MDk2OA%3D%3D%26mid%3D2449471678%26idx%3D1%26sn%3D3ac6241cd22e99c7a84a05ad85618076%26chksm%3D8fbcb6d9b8cb3fcf51ce0ad00b1ca6b0ded8e53c3945e4a5968641fa146e4d32917a844c661c%26token%3D1079957065%26lang%3Dzh_CN%23rd

[4]

https://dev.java/playground/%EF%BC%8C%E5%86%99%E4%B8%80%E4%BA%9B%E7%AE%80%E5%8D%95%E7%9A%84%E6%B5%8B%E8%AF%95%E8%BF%98%E6%98%AF%E5%8F%AF%E4%BB%A5%E7%9A%84%EF%BC%8C%E8%80%8C%E4%B8%94%E4%B8%8A%E9%9D%A2%E6%8F%90%E4%BE%9B%E4%BA%86JDK21%E4%B8%AD%E7%9A%84%E4%B8%80%E4%BA%9B%E6%96%B0%E7%89%B9%E6%80%A7: https://link.juejin.cn/?target=https%3A%2F%2Fdev.java%2Fplayground%2F%25EF%25BC%258C%25E5%2586%2599%25E4%25B8%2580%25E4%25BA%259B%25E7%25AE%2580%25E5%258D%2595%25E7%259A%2584%25E6%25B5%258B%25E8%25AF%2595%25E8%25BF%2598%25E6%2598%25AF%25E5%258F%25AF%25E4%25BB%25A5%25E7%259A%2584%25EF%25BC%258C%25E8%2580%258C%25E4%25B8%2594%25E4%25B8%258A%25E9%259D%25A2%25E6%258F%2590%25E4%25BE%259B%25E4%25BA%2586JDK21%25E4%25B8%25AD%25E7%259A%2584%25E4%25B8%2580%25E4%25BA%259B%25E6%2596%25B0%25E7%2589%25B9%25E6%2580%25A7

[5]

https://mp.weixin.qq.com/s?__biz=MzAxMjA0MDk2OA==&mid=2449472203&idx=1&sn=64bbf97465ac123e777756434be7151f&chksm=8fbcb4acb8cb3dba4e95814c8c83ffa478ece0e6f8719bdc12f8969129519d48139b0f7ef962&token=347567696&lang=zh_CN#rd: https://link.juejin.cn/?target=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAxMjA0MDk2OA%3D%3D%26mid%3D2449472203%26idx%3D1%26sn%3D64bbf97465ac123e777756434be7151f%26chksm%3D8fbcb4acb8cb3dba4e95814c8c83ffa478ece0e6f8719bdc12f8969129519d48139b0f7ef962%26token%3D347567696%26lang%3Dzh_CN%23rd

[6]

https://mp.weixin.qq.com/s/14oUMGpCZwlEAdaXef-NSQ: https://link.juejin.cn/?target=https%3A%2F%2Fmp.weixin.qq.com%2Fs%2F14oUMGpCZwlEAdaXef-NSQ

[7]

https://mp.weixin.qq.com/s/9OVyB9VZm7krNqdbKHTg-g: https://link.juejin.cn/?target=https%3A%2F%2Fmp.weixin.qq.com%2Fs%2F9OVyB9VZm7krNqdbKHTg-g

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术小羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值