前言
OpenJDK:https://openjdk.org/projects/jdk/21/
按排期来说,今天是JDK21 GA的日子
GA:(general availability)正式发布的版本,国外通常用 GA 来标识 release 版本,GA 版本是开发团队认为该版本是稳定版
从图可以看出,自从 2017 年后,升级以 6 个月为周期。速度相当快。
当正在写本文章时候,Last update
从9月1日变为了9月19日
一. 新功能
按照官方文档部分解读
这是windows下载地址
windows: https://download.oracle.com/java/21/latest/jdk-21_windows-x64_bin.zip
1.1 Features
430: String Templates (Preview)
String模板
预览版,这听起来像JavaScript的功能
String name = "Joan";
String info = STR."My name is {name}";
assert info.equals("My name is Joan"); // true
当我们在使用大量的字符串拼接功能时候,各个方法都有写起来不舒服的地方,比如String的一堆
号,再比如StringBuilder的一堆append
,format功能的下标问题等。
文档中还详细举例了其他语言的插值写法,最后诞生了Java的语法。
431: Sequenced Collections
序列化Collections
在Java的这些容器中,序列化并没有在父接口Collection
中实现,而是各自实现或者不实现。所以整体下来,所有容器就都保留着各自数据结构的优缺点。
所以,他们定义了一个新的序列化容器接口?
代码语言:java复制interface SequencedCollection<E> extends Collection<E> {
// new method
SequencedCollection<E> reversed();
// methods promoted from Deque
void addFirst(E);
void addLast(E);
E getFirst();
E getLast();
E removeFirst();
E removeLast();
}
看这几个方法也能明白,为部分操作优化了写法。
这里跳过了一些版本号是因为被破弃。
439: Generational ZGC
重量级 分代ZGC
各种优化,各种升级。但是我现在看不懂。等以后在研究
440: Record Patterns
记录模式
可以理解为自带Lombok
441: Pattern Matching for switch
switch的模式匹配
代码语言:java复制static String formatterPatternSwitch(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();
};
}
内部做了一些防null处理,外部加了简化的语法糖,而且减少了忘记写break
带来的问题。
在JDK8中,向switch传入
null
会报错
442: Foreign Function & Memory API (Third Preview)
翻译为外部函数?和内存API(第三次预览版)
用来替代经常出现漏洞的JNI
443: Unnamed Patterns and Variables (Preview)
未命名/匿名模式与变量(预览版)
配合Record
出的匿名模式,和增强switch搭配。
匿名变量是下划线。
后者经常出现在声明但未使用的情景,比如想用foreach
遍历,但不想用具体数据。
(int x, int _) -> x x
444: Virtual Threads
重磅级的虚拟线程
在Java以前的版本(包括预览版),线程的创建是内核态的,非常的占用资源。光是创建1000个空线程就有1G左右的内存。来到虚拟线程,切换到用户态,极大降低了消耗,提高了速度。
在很多语言中,这个也叫协程/纤程 内核态(Kernel Mode):也被称为系统模式,这是计算机系统中最高的权限级别。在这个模式下,程序可以访问计算机的硬件设备,如CPU、内存、硬盘等,并可以对这些设备进行控制和管理。比如,操作系统就运行在内核态,它可以管理系统中的各种资源,包括处理任务、分配内存、管理设备等。 用户态(User Mode):也被称为用户级别模式,这是计算机系统中较低的权限级别。在这个模式下,程序只能访问和操作特定的用户数据,不能直接访问硬件设备和其他重要的系统资源。用户程序运行在用户态,比如你的文档编辑器、游戏、浏览器等都运行在用户态。
更低的开销,更高的性能,语法无感切换。满眼只有四个字:遥遥领先。
剩下还是一些琐碎的更新,大都可以第三方实现。
445: Unnamed Classes and Instance Main Methods (Preview)
446: Scoped Values (Preview)
448: Vector API (Sixth Incubator)
449: Deprecate the Windows 32-bit x86 Port for Removal
451: Prepare to Disallow the Dynamic Loading of Agents
452: Key Encapsulation Mechanism API
453: Structured Concurrency (Preview)
445: 未命名类和实例主方法(预览) 446:作用域值(预览) 448:向量 API(第六期孵化器) 449: 过时删除 Windows 32 位 x86 端口 451: 准备禁止代理的动态加载 452:密钥封装机制 API 453:结构化并发(预览版)
1.2 值得期待
你升任你升,我用Java 8。
随着GC的升级迭代,虚拟线程的正式上线,如果你对Java性能有需求,那么是时候考虑实践一下了。
二. 云原生时代下的Java
云原生是基于分布部署和统一运管的分布式云,以容器、微服务、DevOps等技术为基础建立的一套云技术产品体系,它不仅仅是指一些具体的技术,更多指的是一套方法论和技术体系的集合,是一种文化。
2.1 Java的现状
- 一次编写,到处运行。
这是我们大多数学习Java听到的一句话。平台无关性使得Java开发者不必担心操作系统。然后随着容器技术的出现,平台无关似乎没那么重要。并且,多了一个中间商,速度也比其他语言慢一些。
- 健壮的生态
新出的语言即使性能再好,也没办法一下取代Java的地位。甚至可以基于Java的框架来实现其他语言对应的框架。(例如 Dubbo go)但是成也生态,败也生态。
如果JDK想大变动,那么跟着的生态也需要同样的变革。比如JDK 17中一个包名的变动,导致很多框架启动就出现错误,甚至不可使用。早期的Spring boot3就是一个经常开荒的案例。
- 新的JVM
为了加速云原生,出现了GraalVM:https://www.graalvm.org/
This release takes AOT performance to the next level and ships G1 GC for AArch64 as well as new Java 21 features such as virtual threads.
上边来自官网首页,可以看出,活跃度蛮高的。
他的出现带来了什么
我们知道Java是半解释半执行。那么就有了即时编译(JIT):可以实现动态代理,反射等,并且出现了我们所说的AOP,当然这牺牲了一部分性能;运行前编译(AOT):全编译提升运行速度,牺牲了反射。
GraalVM的出现就是为了缩小这一差距,从而实现:不用任何解释器就可运行。
2.2 未来的Java预言
现在习惯新设计以Next结尾,那么我姑且称之为Java Next
不破不立,Spring boot3就是一个代表,未来会更多的强制需求,升级JDK版本。
抛弃JVM,轻量级的Java甚至运行在浏览器上。
融合AI,AI看起来发展很快,但其实他才三十多岁,并且大概每十年出现一个现象级产品。如果编程也更加智能,那么Java依然是首选。
我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表