继 SpringBoot 3.0,Elasticsearch8.0 官宣:拥抱 Java 17

开发 前端
新版任你发,我用 Java 8,这可能是当下 Java 开发者的真实写照。不过时代可能真的要抛弃 Java 8,全面拥抱 Java 17 了。

大家好,我是君哥。

新版任你发,我用 Java 8,这可能是当下 Java 开发者的真实写照。不过时代可能真的要抛弃 Java 8,全面拥抱 Java 17 了。

Spring Boot 3.0

前些天,相信小伙伴们都注意到了,SpringBoot 发布了 3.0.0-M1 版本,并官宣全面拥抱 Java 17,下面的截图是 Release Notes 中的一段:

其他的新特性大家可以去 Github 查看。

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0.0-M1-Release-Notes/16c166b5fb4232998a8cfd3966c2851ec1eddf02

Spring Boot 3.0.0-M1 版本发布,也意味着 Spring Boot 进入 3.x 版本的迭代,同时也看到,3.x 版本开始 Spring Boot 要全面拥抱 Java 17 了。

Elastic 8

凑巧的是,2022 年 2 月 11 日,Elastic 也发布了新版本 Elastic 8,这个版本跟上个版本间隔了 3 年。下面的截图是 Issue 79873:

可以看到,运行新的 Elasticsearch 版本需要 Java 17 了。

Java 17

从 Java 8 以后,每个版本发布都增加了哪些新特性呢?我们一起来看一下。

Java 9

  • 私有接口方法
  • 默认垃圾收集器改为 G1
  • HTTP client,支持 WebSocket、HTTP/2、HTTPS/TLS、非阻塞 API。

Java 10

  • 局部变量类型推断,可以使用 var 类型来定义变量。
  • 不可变集合
  • G1 支持并行 Full GC
  • 基于 Java 的 JIT 编译器 Graal
  • 支持在不执行全局安全点的情况下执行线程回调,这样可以在不停止所有线程的情况下停止单个线程。

Java 11

  • 标准 HTTP Client 升级
  • 引入 ZGC 垃圾收集器
  • Flight Recorder,可以收集基于 OS、JVM和JDK 事件产生的数据。
  • 对Stream、Optional、集合 API进行增强。

Java 12

  • 引入 Switch 表达式
  • Shenandoah GC 垃圾收集算法
  • JMH 基准测试
  • G1 支持可中断的 mixed GC,将 Mixed GC 拆分为强制部分和可选部分,强制部分一定会被回收,可选部分可以不被回收,这样垃圾收集过程中优先处理强制集,更容易满足暂停时间目标。
  • G1 可以归还不使用的内存给操作系统

Java 13

  • switch 优化更新,增加 yield 关键字用于返回结果。
  • ZGC 支持将未使用的内存归还操作系统
  • 引入了文本块,可以使用 """ 三个引号表示文本块,示例代码如下:
String html = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";

Java 14

  • instanceof 语法简化,可以直接给对象赋值:
if (obj instanceof String s) { 
//这里可以使用 s 变量
} else {
//这里不能使用 s 变量
}
  • 引入 Record,类似于枚举类型,具有 Lombok 功能,可以自动生成构造器、equals、getter 等方法。
  • 放弃 CMS

Java 15

  • 引入 hidden class
  • String.substring 优化,如果长度为 0,返回 null
  • 引入 Sealed class

Java 16

  • Stream新增toList方法
  • 提供jpackage
  • java.time 根据时段获取时间

Java 17

  • 升级 switch 使用,switch可直接用 instanceof 模式匹配选择,不过需要提前做 null 判断(下面代码选自 oschina):
Object o;
switch (o) {
case null -> System.out.println("首先判断对象是否为空,走空指针逻辑等后续逻辑");
case String s -> System.out.println("判断是否为字符串,s:" + s);
case record p -> System.out.println("判断是否为Record类型: " + p.toString());
case int[] arr -> System.out.println("判断是否为数组,展示int数组的长度" + ia.length);
case Integer i -> System.out.println("判断是否为Intger对象,i:" + i);
case Student s -> System.out.println("判断是否为具体学生对象,student:" + s.toString());
case UserCommonService -> System.out.println("判断是否为普通用户实现类,然后走普通用户逻辑");
case UserVipService -> System.out.println("判断是否为vip用户实现类,然后走vip用户逻辑");
default -> System.out.println("Something else");
}
  • 默认启用 Parallel GC
  • 增强TreeMap
  • 统一日志异步刷新,先将日志写入缓存,独立线程负责刷新到相应输出。

上面的版本只有 Java 11 和 Java 17 是 LTS(Long Term Support) 版本。

总结

全面拥抱 Java 17 还没有真的到来,但已经在路上了,作为程序员的我们应该做准备了。


责任编辑:武晓燕 来源: 君哥聊技术
相关推荐

2022-06-10 14:17:19

5G R175G创新

2023-06-29 07:54:19

2020-12-25 14:55:13

VS Code代码编程

2023-08-31 22:50:12

微软开发

2018-11-15 11:17:46

智慧城市

2021-05-28 13:44:02

华为MatePad Pro鸿蒙系统

2016-12-09 08:51:18

GoogleDevelopers网站

2015-05-20 15:51:50

敏捷网络/华为

2015-05-21 08:55:46

华为敏捷网络

2024-01-18 15:17:56

谷歌云计算三星

2022-04-25 10:34:19

云原生直播

2019-12-26 09:26:50

青云QingCloud

2021-11-01 05:35:57

Avast免费杀毒Windows 11

2018-10-17 09:47:38

微博搜索全面技术储备

2021-05-11 08:52:16

iCloud苹果文稿和数据

2021-05-19 07:00:59

Windows10操作系统微软

2019-02-15 15:41:11

代码开发技术
点赞
收藏

51CTO技术栈公众号