老早就在 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/,我已经把之前的…
不管你工作上用的 JDK版本是不是 1.8,都可以下载下来尝试一下,早点熟悉、早点适应,早晚会用上的。
打开官方 JDK21的项目页,可以在 Features 列表看到新增的功能,带 Preview 样式的是预览功能,也就是非正式功能。
没想到 String Templates(字符串模板)和 Structured Concurrency(结构化并发)还是预览版。
序列化集合接口
新增了序列集合接口 SequencedCollection,我们常用的 ArrayList、LinkedList等都实现了这个接口。
java
复制代码
publicinterfaceSequencedCollection<E> extendsCollection<E> { SequencedCollection<E> reversed();defaultvoidaddFirst(E e) {thrownewUnsupportedOperationException(); }default E getFirst() {returnthis.iterator().next(); }default E getLast() {returnthis.reversed().iterator().next(); }default E removeLast() {varit=this.reversed().iterator();Ee= it.next(); it.remove();return e; }}
可以方便的获取第一个、最后一个元素、移除最后一个元素、在头部插入元素。
java
复制代码
List<Integer> integerList = List.of(1,2,3);// 翻转列表List<Integer> reversed = integerList.reversed();reversed.forEach(System.out::println);// 获取第一个元素Integerfirst= integerList.getFirst();
之前获取第一个元素是 list.get(0),现在用 list.getFirst()就可以了。
这个功能只能算是锦上添花的功能吧,并么有比之前方便多少。
ZGC 增加分代
可能很多人对 JVM 垃圾收集器的最新款还停留在 G1上。ZGC 是在 JDK11中推出的,ZGC是低延迟垃圾收集器,几乎是全并发,停顿时间不超过10ms。
JDK21中对 ZGC 进行了功能扩展,增加了分代功能,比如 CMS 收集器区分老年代和年轻代,这样一来,可以更频繁的回收年轻代。
要使用 ZGC 以及分代功能,需要加入下面的参数。
bash
复制代码
-XX:+UseZGC -XX:+ZGenerational
Record 匹配模式
我们先声明一个 Record
java
复制代码
recordPerson(String name, int age) {}
在 JDK21之前,我们要用 instanceof 判断一个对象,并取出对象的字段时,会这样做。
java
复制代码
Personp=newPerson("John", 25);if(p instanceof Person) { System.out.println("Name: " + p.name);}
现在可以这样了,直接将参数带着,然后自动解析出参数在实体中的具体值。
java
复制代码
Personp=newPerson("John", 25);// 可以直接解构记录字段if(p instanceofPerson(String name, int age)) { System.out.println("Name: " + name);}// 或者switch (p) {casePerson(String n, int a) -> { System.out.println("Name: " + n + ", Age: " + a); }}
switch 增强
不多说,就看看下面这个方法,可以直接根据参数类型进行匹配
java
复制代码
static String switchObject(Object obj) {returnswitch (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(); };}
我们调用上面的方法
java
复制代码
varstrObj="字符串";varintObj=1;vardoubleObj=8.88D;System.out.println(switchObject(strObj));System.out.println(switchObject(intObj));System.out.println(switchObject(doubleObj));
得到的输出内容为:
bash
复制代码
String 字符串int 1double 8.880000
还有更多的模式等待探索。
虚拟线程(Virtual Threads)
虚拟线程是基于协程的线程,它们与其他语言中的协程具有相似之处,但也存在一些不同之处。
虚拟线程是依附于主线程的,如果主线程销毁了,那虚拟线程也不复存在。
相同之处:
- 虚拟线程和协程都是轻量级的线程,它们的创建和销毁的开销都比传统的操作系统线程要小。
- 虚拟线程和协程都可以通过暂停和恢复来实现线程之间的切换,从而避免了线程上下文切换的开销。
- 虚拟线程和协程都可以使用异步和非阻塞的方式来处理任务,提高应用程序的性能和响应速度。
不同之处:
- 虚拟线程是在 JVM 层面实现的,而协程则是在语言层面实现的。因此,虚拟线程的实现可以与任何支持 JVM 的语言一起使用,而协程的实现则需要特定的编程语言支持。
- 虚拟线程是一种基于线程的协程实现,因此它们可以使用线程相关的 API,如 ThreadLocal、Lock 和 Semaphore。而协程则不依赖于线程,通常需要使用特定的异步编程框架和 API。
- 虚拟线程的调度是由 JVM 管理的,而协程的调度是由编程语言或异步编程框架管理的。因此,虚拟线程可以更好地与其他线程进行协作,而协程则更适合处理异步任务。
具体的使用可以参考这篇文章 JDK21引入协程,再也不用为并发而头疼了
Key Encapsulation Mechanism API
提供一套非对称加密的API。使应用程序能够使用 KEM 算法,例如 RSA 密钥封装机制 (RSA-KEM)、椭圆曲线集成加密方案 (ECIES) 以及美国国家标准与技术研究院 (NIST) 后量子加密标准化过程的候选 KEM 算法。
我们如果用 Java 8 的话,涉及到加密算法的部分几乎都是用的第三方加密,那升级了 JDK21之后,就不用使用第三方包了。
在线 Java 编码平台
dev.java/playground/… Demo。
下面是我的测试代码,可以正常运行,但是不支持中文。
最后
不管怎么升级,还是有很多公司、很多人会持续用 Java 8的,毕竟技术服务于业务,业务稳定才是根本。
应该很快从 Java 8 升级到更高版本的团队和个人会越来越多,毕竟相比 8 而言,新版本有了更多的新特性,支持的场景更多,而且性能也更好了。
有没有用高于 Java 8 版本的同学,上来举个手。
本文暂时没有评论,来添加一个吧(●'◡'●)