2023年Java语言盘点
- 前言
- 语言排行榜
- JDK 各个版本使用情况
- 主流框架支持情况
- JDK 21
- 其他项目
- 参考
前言
星河流转,日月更替,在2023这年里,Java也迎来了它的第28个年头。在这一年里,Java生态系统发生了许多让人瞩目的变化,包括Java语言本身的更新、亦或是主流框架的迭代,以及开发者社区的活跃程度。那么本文让我们一起盘点2023年Java都做了哪些改变。
语言排行榜
如图,数据来源于Tiobe index。首先,我们可以先看看各大程序语言在全球的使用情况,我们的Java同比去年,使用人数下滑了3.83%,但这影响不了我们Java社区及生态稳定发展的势头。
Dec 2023 | Dec 2022 | Change | Programming Language | Ratings | Change | |
---|---|---|---|---|---|---|
1 | 1 | Python | 13.86% | -2.80% | ||
2 | 2 | C | 11.44% | -5.12% | ||
3 | 3 | C++ | 10.01% | -1.92% | ||
4 | 4 | Java | 7.99% | -3.83% | ||
5 | 5 | C# | 7.30% | +2.38% | ||
6 | 7 | JavaScript | 2.90% | -0.30% | ||
7 | 10 | PHP | 2.01% | +0.39% | ||
8 | 6 | Visual Basic | 1.82% | -2.12% | ||
9 | 8 | SQL | 1.61% | -0.61% | ||
10 | 9 | Assembly language | 1.11% | -0.76% | ||
11 | 21 | Scratch | 1.08% | +0.41% | ||
12 | 26 | Fortran | 1.07% | +0.64% | ||
13 | 12 | Go | 1.03% | -0.12% | ||
14 | 14 | MATLAB | 0.93% | -0.02% | ||
15 | 23 | Kotlin | 0.92% | +0.34% | ||
16 | 16 | Delphi/Object Pascal | 0.92% | +0.07% | ||
17 | 15 | Swift | 0.82% | -0.09% | ||
18 | 20 | Rust | 0.80% | +0.12% | ||
19 | 17 | Ruby | 0.77% | -0.04% | ||
20 | 11 | R | 0.72% | -0.53% |
JDK 各个版本使用情况
再来看看我们的JDK各个版本使用,可以看到2023年了,如图数据,来源于jetbrains公司公布的数据。可以看到我们的JDK 8依然抗打,然后排在第二的就是我们的JDK 17了。
ps:笔者现在的公司很多项目都逐渐升级到JDK 17了,不得不说在GC方面确实给力了很多,之前一些老项目,经常出现full gc,想改代码又实在改不动,升上17后,明显好转了。
主流框架支持情况
首先我们把目光看向Spring。可以看到Spring Framework 6 和 Spring Boot 3对JDK版本的最低要求是JDK 17,这也间接导致很多团队和开发者将被迫从Java 11升级到17,或者像笔者的公司,从Java 8直接升级到Java 17版本。
另一方面,我们这里也要说说我们的JDK 21。该版本在2023 年 9 月 19 日正式亮相,作为一个**LTS版本,**它给我们带来了哪些惊喜呢?别急,待会我们接着看,这里我们可以看到像Tomcat 11 紧跟步伐,把JDK最低要求也提到了JDK 21,不过目前还是一个alpha版本(内部测试版)。
JDK 21
2023 年 9 月 19 日,JDK 21正式亮相,并且作为一个LTS版本。那么它带来了哪些新特征呢?参考Oracle官网的描述,带来的改变很多,有新加的特征,有废弃的方式,如下笔者列举部分有趣的变化进行描述。
- JEP 431:Sequenced Collections(序列化集合)
- 在Java里,如果我们想确保集合里的元素的顺序是按照插入的顺序( encounter order,)排序的,我们可以用List 或 Queue的实现类,也可以用SortedSet和LinkedHashSet。
- 而对于Java集合的公共接口,如List或者Collection是没有一个统一的描述 encounter order的接口,这样对于用抽象接口定义的参数类型,某些场景下,不得不向下强转为具体的类型。
- 另一方面,对于获取集合的第一个元素和最后一个元素,不同的集合也有不同的处理方式,这些问题都是用户使用过程中,经常吐槽的点。
- 为了解决上述问题, **Sequenced Collections **的出现就应运而生了。它包含了三个接口:Sequenced Collections 包括以下三个接口,如图,来源于OpenJDK官网:
1. SequencedCollection
2. SequencedSet
3. SequencedMap
- JEP 439:Generational ZGC(分代 ZGC)
- 增强了ZGC的分代 GC 功能,不过为了确保平滑过渡,默认是关闭的,可以使用如下参数开启。在未来的版本中,官方计划把 ZGenerational 设为默认值,而在更晚的版本中,非分代 ZGC 计划被移除。
// 启用分代ZGC
java -XX:+UseZGC -XX:+ZGenerational ...
- JEP 440:Record Patterns(记录模式)
- 记录模式(Record Patterns) 可对 record 的值进行解构,也就是更方便地从记录类(Record Class)中提取数据,与 instanceof 或 switch 一起搭配使用。它可以帮助我们从一些复杂的嵌套对象中,直接解析出对应的属性值。这里我们引入官网给的一个例子:
// 申明几个记录类
record Point(int x, int y) {}
enum Color { RED, GREEN, BLUE }
record ColoredPoint(Point p, Color c) {}
record Rectangle(ColoredPoint upperLeft, ColoredPoint lowerRight) {}
我们可以使用记录模式提取对象的组成部分。如果我们想从左上角提取颜色,我们可以这样写:
static void printUpperLeftColoredPoint(Rectangle r) {
if (r instanceof Rectangle(ColoredPoint ul, ColoredPoint lr)) {
// 打印颜色属性值
System.out.println(ul.c());
}
}
该ColoredPoint也是一个记录类,可以进一步分解它:
static void printColorOfUpperLeftPoint(Rectangle r) {
if (r instanceof Rectangle(ColoredPoint(Point p, Color c),
ColoredPoint lr)) {
System.out.println(c);
}
}
- JEP 444:Virtual Threads(虚拟线程)
- 关于虚拟线程,在 Java 19 和JDK 20 中还是处于预览状态,在 JDK21 正式亮相。
- 在了解虚拟线程之前,我们可能得先了解另外一个名词platform thread(平台线程),platform thread由我们得JVM控制,运行在OS Threads之上。
- 从上图可知,传统的平台线程(platform thread)由操作系统内核和硬件支持的,这样在创建和管理线程的成本相对较高,处理大规模并发时的性能和可维护性问题(尤其是IO密集型任务)也加然而生。
- 于是,在我们的平台线程上,又做了一层抽象,整个结构图如下,本质上,它是 我们JDK线程包 java.lang.Thread 的一个实例,跟平台线程独占操作系统线程不同,多个虚拟线程通过我们的平台线程上可以共享某一个操作系统线程;而一个虚拟线程在它的生命周期内,又可以通过平台线程的,合理利用多个操作系统线程资源,从而最大化CPU利用率,这也是我们IO密集型任务多的时候(阻塞时间片段多),通过虚拟线程可以提高程序吞吐量的原因。
其他项目
除了官方项目之外,我们把目光转移到一些很重要的 OpenJDK 项目上,看看2023年都有哪些特性:
- Project Loom: 旨在改进 Java 在处理大规模并发应用时的性能和可维护性,引入了虚拟线程的概念。
- 随着JDK 21发布,虚拟线程也算正式落地了,具体报告可以看看这个。
- Project Valhalla: 专注于 Java 语言的数据类型和性能优化,旨在提供更好的值类型和数组操作支持。关于他们目前研究的值类型预览(Value Objects),还是比较有意思的:
- Value Objects, introducing class instances that lack identity
- Project Amber: 旨在改进 Java 语言的开发体验,引入了局部变量类型推断、模式匹配等语法糖和语言特性。像字符串模板匹配、
- 463: Implicitly Declared Classes and InstancemainMethods (Second Preview)
- 459: String Templates (Second Preview)
- 456: Unnamed Variables and Patterns
- 455: Primitive types in Patterns, instanceof, and switch (Preview)
- 447: Statements beforesuper(…)(Preview)
参考
https://www.oracle.com/java/technologies/javase/21-relnote-issues.html
https://openjdk.org/jeps/444
https://openjdk.org/jeps/441
https://openjdk.org/jeps/440
https://openjdk.org/jeps/431
https://www.tiobe.com/tiobe-index/
https://www.jetbrains.com/lp/devecosystem-2023/java/