【Java】2023年Java语言盘点

2024-01-07 18:48:53

前言

星河流转,日月更替,在2023这年里,Java也迎来了它的第28个年头。在这一年里,Java生态系统发生了许多让人瞩目的变化,包括Java语言本身的更新、亦或是主流框架的迭代,以及开发者社区的活跃程度。那么本文让我们一起盘点2023年Java都做了哪些改变。

语言排行榜

如图,数据来源于Tiobe index。首先,我们可以先看看各大程序语言在全球的使用情况,我们的Java同比去年,使用人数下滑了3.83%,但这影响不了我们Java社区及生态稳定发展的势头。

Dec 2023Dec 2022ChangeProgramming LanguageRatingsChange
11Python13.86%-2.80%
22C11.44%-5.12%
33C++10.01%-1.92%
44Java7.99%-3.83%
55C#7.30%+2.38%
67JavaScript2.90%-0.30%
710PHP2.01%+0.39%
86Visual Basic1.82%-2.12%
98SQL1.61%-0.61%
109Assembly language1.11%-0.76%
1121Scratch1.08%+0.41%
1226Fortran1.07%+0.64%
1312Go1.03%-0.12%
1414MATLAB0.93%-0.02%
1523Kotlin0.92%+0.34%
1616Delphi/Object Pascal0.92%+0.07%
1715Swift0.82%-0.09%
1820Rust0.80%+0.12%
1917Ruby0.77%-0.04%
2011R0.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版本(内部测试版)。
re.png

JDK 21

2023 年 9 月 19 日,JDK 21正式亮相,并且作为一个LTS版本。那么它带来了哪些新特征呢?参考Oracle官网的描述,带来的改变很多,有新加的特征,有废弃的方式,如下笔者列举部分有趣的变化进行描述。

  • JEP 431:Sequenced Collections(序列化集合)
    • 在Java里,如果我们想确保集合里的元素的顺序是按照插入的顺序( encounter order,)排序的,我们可以用ListQueue的实现类,也可以用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之上。

image.png

  • 从上图可知,传统的平台线程(platform thread)由操作系统内核和硬件支持的,这样在创建和管理线程的成本相对较高,处理大规模并发时的性能和可维护性问题(尤其是IO密集型任务)也加然而生。
  • 于是,在我们的平台线程上,又做了一层抽象,整个结构图如下,本质上,它是 我们JDK线程包 java.lang.Thread 的一个实例,跟平台线程独占操作系统线程不同,多个虚拟线程通过我们的平台线程上可以共享某一个操作系统线程;而一个虚拟线程在它的生命周期内,又可以通过平台线程的,合理利用多个操作系统线程资源,从而最大化CPU利用率,这也是我们IO密集型任务多的时候(阻塞时间片段多),通过虚拟线程可以提高程序吞吐量的原因。

image.png

其他项目

除了官方项目之外,我们把目光转移到一些很重要的 OpenJDK 项目上,看看2023年都有哪些特性:

  1. Project Loom: 旨在改进 Java 在处理大规模并发应用时的性能和可维护性,引入了虚拟线程的概念。
  2. Project Valhalla: 专注于 Java 语言的数据类型和性能优化,旨在提供更好的值类型和数组操作支持。关于他们目前研究的值类型预览(Value Objects),还是比较有意思的:
  3. Project Amber: 旨在改进 Java 语言的开发体验,引入了局部变量类型推断、模式匹配等语法糖和语言特性。像字符串模板匹配、

参考

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/

文章来源:https://blog.csdn.net/legendaryhaha/article/details/135439558
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。