java 目前的发展

引言

作为一个 java 开发者自然是对 java 语言发展很关心的,虽然工作万年 jdk 8,但是新版本的 jdk 用到生产环境应该也不会远了。

jdk

从 2017 年开始,JDK 版本更新策略从原来的每两年一个新版本,改为每六个月一个新版本,以快速验证新特性,推动 Java 的发展。所以 jdk 的版本号也是飞速的开始上涨,看着有要跟上 chrome 114.0.5735.110 版本号 的节奏

因为 jdk 版本号刷的太快了,就主要介绍 lts 版本

中间主要更新重点是这些项目

Loom,Valhalla,Amber,Panama

  • amber ,直译是琥珀,旨在提升 Java 的语言表现力,其中 var 关键字、text block 、record class 、sealed class 和模式匹配等,就是这个项目的产品,它们大多都以上线(released)。

  • loom ,直译是织布机,为 Java 引入虚拟线程(与协程进行区分),有点类似 goroutine ,完全由 JVM 管理和调度的用户态轻量级线程,完全与现有的 thread api 兼容。

  • panama ,取巴拿马运河沟通大西洋和太平洋之意,旨在提升 Java 调用外部语言 /接口等的能力,Java16 的向量化 API 源自于此。

  • valhalla ,直译是北欧神话中的英灵殿,为 Java 引入值类型和用户定义的基本量类型。

jdk 11

本地变量类型推断

1
2
3
4
5
6
7
8
9
10
// LocalVar.java
import java.util.Arrays;
public class LocalVar {
public static void main(String[] args) {
Arrays.asList("Java", "Python", "Ruby")
.forEach((var s) -> {
System.out.println("Hello, " + s);
});
}
}

局部变量类型推断就是左边的类型直接使用 var 定义,而不用写具体的类型,编译器能根据右边的表达式自动推断类型。

字符串加强

1
2
3
4
5
6
7
8
9
10
11
12
// 判断字符串是否为空白
" ".isBlank(); // true
// 去除首尾空格
" Javastack ".strip(); // "Javastack"
// 去除尾部空格
" Javastack ".stripTrailing(); // " Javastack"
// 去除首部空格
" Javastack ".stripLeading(); // "Javastack "
// 复制字符串
"Java".repeat(3);// "JavaJavaJava"
// 行数统计
"A\nB\nC".lines().count(); // 3

集合加强

自 Java 9 开始,Jdk 里面为集合(List/ Set/ Map)都添加了 of 和 copyOf 方法,它们两个都用来创建不可变的集合.

1
2
3
var list = List.of("Java", "Python", "C");
var copy = List.copyOf(list);
System.out.println(list == copy); // true

Stream 加强

Stream 是 Java 8 中的新特性,Java 9 开始对 Stream 增加了以下 4 个新方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
Stream.ofNullable(null).count(); // 0


//增加 takeWhile 和 dropWhile 方法
Stream.of(1, 2, 3, 2, 1)
.takeWhile(n -> n < 3)
.collect(Collectors.toList()); // [1, 2]


从开始计算,当 n < 3 时就截止。
Stream.of(1, 2, 3, 2, 1)
.dropWhile(n -> n < 3)
.collect(Collectors.toList()); // [3, 2, 1]

HTTP Client API

这是 Java 9 开始引入的一个处理 HTTP 请求的的孵化 HTTP Client API,该 API 支持同步和异步,而在 Java 11 中已经为正式可用状态,你可以在 java.net 包中找到这个 API。

限于篇幅,还有很多更新也比较重要,就不一一介绍了。

jdk 17

这个版本是想当重量级,因为 spring boot 3 最低支持版本就是 jdk 17,虽然刚开始很多人对 spring 如此激进的跨版本升级有很多疑问,但是我觉得是一件很好的事情,由 spring 牵头的话,国内万年 jdk 8 的场面应该是可以改变一些了。

以下是 jdk 17 相关新特性

  • 306:Restore Always-Strict Floating-PointSemantics / 恢复始终严格的浮点语义
  • 356:Enhanced Pseudo-Random Number Generators / 增强型伪随机数发生器
  • 382:New macOS Rendering Pipeline / 新的 macOS 渲染管道
  • 391:macOS/AArch64 Port / macOS/AArch64 平台支持
  • 398:Deprecate the Applet API for Removal / 弃用即将删除的Applet API
  • 403:Strongly Encapsulate JDK Internals / 强封装JDK的内部API
  • 406:Pattern Matching for switch(Preview) / Switch模式匹配(预览)
  • 407:Remove RMI Activation / 删除 RMI 激活机制
  • 409:Sealed Classes / 密封类
  • 410:Remove the Experimental AOT and JIT Compiler / 删除实验性 AOT 和 JIT 编译器
  • 411:Deprecate the Security Manager For Removal / 弃用即将删除的安全管理器
  • 412:Foreign Function & Memory API(Incubator) / 外部函数和内存 API(孵化器)
  • 414:Vector API (Second Incubator) / 矢量 API(二次孵化)
  • 415:Context-Specific Deserialization Filters / 特定于上下文的反序列化过滤器

总的来时更新不是特别多,但是开发体验上跟 jdk 8 比已经很舒服了。

而且新能上比 jdk 8 也是优秀许多的。

17版本默认 gc 回收器也更改为了 g1 垃圾回收器。

jdk 21

这个版本距离生产环境估计还是比较远的。

  • JEP 429:作用域值(孵化器)
  • JEP 434:外部函数和内存 API(第二次预览)
  • JEP 436:虚拟线程(第二次预览)
  • JEP 437:结构化并发(第二个孵化器)
  • JEP 438: Vector API (第五个孵化器)
  • JEP 432:记录模式(第二次预览)
  • JEP 433:switch 模式匹配(第四次预览)

不过里面最值得关注的就是 java 版本的虚拟线程了。

框架

spring boot3

上面已经说过,spring boot 3一口气把 jdk 版本升到了 17,并且支持了 AOT,不过是基于 Graalvm 实现的。个人体验过了一些,只能说目前 AOT 只适用于个人项目玩玩,生产环境可能会损失很多性能,而且项目编译成 AOT 时,非常的慢。

quarkus

Quarkus是一个全栈Kubernetes原生Java框架,用于Java虚拟机(JVM)和原生编译,专门针对容器优化Java,使其成为无服务器、云和Kubernete环境的有效平台。

个人体验了一下,在国内的话生态什么的肯定还是不如 spring ,不过有竞争,也可以让 spring 继续改善。


java 目前的发展
http://xxpain.github.io/2023/06/08/java-future/
作者
无情小肥羊
发布于
2023年6月8日
许可协议