【Java】2023年Java语言盘点

2023年Java语言盘点

  • 前言
  • 语言排行榜
  • JDK 各个版本使用情况
  • 主流框架支持情况
  • JDK 21
  • 其他项目
  • 参考

前言

星河流转,日月更替,在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 在处理大规模并发应用时的性能和可维护性,引入了虚拟线程的概念。
    • 随着JDK 21发布,虚拟线程也算正式落地了,具体报告可以看看这个。
  2. Project Valhalla: 专注于 Java 语言的数据类型和性能优化,旨在提供更好的值类型和数组操作支持。关于他们目前研究的值类型预览(Value Objects),还是比较有意思的:
    • Value Objects, introducing class instances that lack identity
  3. 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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/299686.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机Java项目|Springboot疫情网课管理系统

项目编号:L-BS-ZXBS-07 一,环境介绍 语言环境:Java: jdk1.8 数据库:Mysql: mysql5.7 应用服务器:Tomcat: tomcat8.5.31 开发工具:IDEA或eclipse 二,项目简介 疫情网课也都将通过计算机…

智能计价器Scratch-第14届蓝桥杯Scratch省赛真题第5题

5. 智能计价器(80分) 背景信息:A城市的出租车计价:3公里以内13元,基本单价每公里2.3元(超过3公里的部分,不满1公里按照1公里收费),燃油附加费每运次1元。例如:3.2公里的…

1875_如何提升开关应用中的EMI表现

Grey 全部学习内容汇总: https://github.com/GreyZhang/g_hardware_basic 1875_如何提升开关应用中的EMI表现 看了一份ST的应用笔记,简单了解了一下EMI相关的一些设计,感觉还比价有收获。整理一下自己的收获点。 资料整理过程说明 参考资…

并发(8)

目录 46.Thread.sleep(),Object.wait(),Condition.await(),LockSupport.part()的区别? 47.如果在wait()之前执行了notify()会怎样? 48.如果在park()之前执行了unpark()会怎样? 49.什么是AQS&…

【Spring Cloud】关于Nacos配置管理的详解介绍

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Spring Cloud》。🎯🎯 &am…

从零实现CLIP模型

1. 引言 CLIP代表语言图像对比预训练模型,是OpenAI于2021年开发的一个深度学习模型。CLIP模型中图像和文本嵌入共享相同的潜在特征空间,从而能够在两种模式之间直接进行对比学习。这是通过训练模型使相关的图像和文本更紧密地结合在一起,同时…

基于原子搜索算法优化的Elman神经网络数据预测 - 附代码

基于原子搜索算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于原子搜索算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于原子搜索优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

Linux:nginx设置网站https

http和https的区别 http: 80 https: 443 这种协议比http协议要安全,因为传输数据是经过加密的 HTTPS简介 HTTPS其实是有两部分组成:HTTP SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过…

在IDEA中使用git分支进行开发然后合并到Master分支,2022.1.x版本

在实际开发过程中,为了避免因为在开发中出现的问题以及方便发布版本,如果是多版本发布的情况相下,我们通常需要采用分支进行开发,这个时候,我们就需要了解git分支的相关知识点了,本篇博客也是博主在实际公司…

【SpringCloud】之配置中心(进阶使用)

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《SpringCloud开发之远程消费》。🎯&a…

MMFF-NET:多层次多尺度特征融合的弱光图像增强网络

这是我去年的工作,我录用的第一篇SCI,很拉,3区。今年中科院新版分区,变成4区了。很遗憾。后面会持续给大家更新我的文章以及我的内容。硕士阶段的东西几乎创新点都很差。 但是对于初学者我希望它有一定的参考价值。 文章链接&am…

利用Type类来获得字段名称(Unity C#中的反射)

使用Type类以前需要引用反射的命名空间: using System.Reflection; 以下是完整代码: public class ReflectionDemo : MonoBehaviour {void Start(){A a new A();B b new B();A[] abArraynew A[] { a, b };foreach(A v in abArray){Type t v.GetTyp…

不带控制器打包exe,转pdf文件时失败的原因

加了注释的两条代码后,控制器会显示一个docx转pdf的进度条。这个进度条需要控制器的实现,如果转exe不带控制器的话,当点击转换为pdf的按钮就会导致程序出错和闪退。 __init__.py文件的入口

分布式事务理论及Seata实践

分布式事务简介 事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。事务的四个特征(ACID) …

FineBI实战项目一(3):Kettle实现ETL到数据仓库

目前,finebi_shop_bi 中是没有任何数据的,是一个空的数据库。而后续我们的所有数据分析都将在该数据库中进行。我们第一件事情就是要将 「finebi_shop」数据库中的所有表抽取到「finebi_shop_bi」数据库中。要抽取并装载数据到「finebi_shop_bi」中&…

超维空间M1无人机使用说明书——51、ROS无人机使用AR二维码识别与定位

引言:二维码识别与定位是指ROS通过创建AR标签并且对AR标签进行识别,标签可以由自己任意创建,具体方法会在文中给出,摄像头可以通过识别AR标签大小和姿态获取到标签对应的ID和位置等信息,实现识别与定位 注意&#xff…

Qt/QML编程学习之心得:Linux下Thread线程创建(26)

GUI设计中经常为了不将界面卡死,会用到线程Thread,而作为GUI设计工具,Qt也提供了一个这样的类,即QThread。 QThread对象管理程序中的一个控制线程。线程QThread开始在run()中执行。默认情况下,run()通过调用exec()启动事件循环,并在线程内运行Qt事件循环。 也可以通过…

Camtasia2024苹果Mac电脑版(屏幕录制剪辑软件)

Camtasia Mac2024免费版是一款由TechSmith公司官方进行汉化推出的最新版本,借助Camtasia,您可以轻松记录屏幕并创建优美,专业的视频。记录所有内容-您的整个屏幕或只是一个窗口。或者,添加您已经拥有的视频,图像&#…

python 文件

open """ def open(file: FileDescriptorOrPath, //路径mode: OpenTextMode "r", //设置打开文件的模式 r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 w 打开一个文件只用写入。如果该文件已存在则打开文件&#…

一文讲透Python数据分析可视化之直方图(柱状图)

直方图(Histogram)又称柱状图,是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据类型,纵轴表示分布情况。通过绘制直方图可以较为直观地传递有关数据的变化信息,使…