繼 SpringBoot 3.0,Elasticsearch8.0 官宣:擁抱 Java 17
大家好,我是君哥。
新版任你發(fā),我用 Java 8,這可能是當(dāng)下 Java 開發(fā)者的真實(shí)寫照。不過時(shí)代可能真的要拋棄 Java 8,全面擁抱 Java 17 了。
Spring Boot 3.0
前些天,相信小伙伴們都注意到了,SpringBoot 發(fā)布了 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 版本發(fā)布,也意味著 Spring Boot 進(jìn)入 3.x 版本的迭代,同時(shí)也看到,3.x 版本開始 Spring Boot 要全面擁抱 Java 17 了。
Elastic 8
湊巧的是,2022 年 2 月 11 日,Elastic 也發(fā)布了新版本 Elastic 8,這個(gè)版本跟上個(gè)版本間隔了 3 年。下面的截圖是 Issue 79873:
可以看到,運(yùn)行新的 Elasticsearch 版本需要 Java 17 了。
Java 17
從 Java 8 以后,每個(gè)版本發(fā)布都增加了哪些新特性呢?我們一起來看一下。
Java 9
- 私有接口方法
- 默認(rèn)垃圾收集器改為 G1
- HTTP client,支持 WebSocket、HTTP/2、HTTPS/TLS、非阻塞 API。
Java 10
- 局部變量類型推斷,可以使用 var 類型來定義變量。
- 不可變集合
- G1 支持并行 Full GC
- 基于 Java 的 JIT 編譯器 Graal
- 支持在不執(zhí)行全局安全點(diǎn)的情況下執(zhí)行線程回調(diào),這樣可以在不停止所有線程的情況下停止單個(gè)線程。
Java 11
- 標(biāo)準(zhǔn) HTTP Client 升級
- 引入 ZGC 垃圾收集器
- Flight Recorder,可以收集基于 OS、JVM和JDK 事件產(chǎn)生的數(shù)據(jù)。
- 對Stream、Optional、集合 API進(jìn)行增強(qiáng)。
Java 12
- 引入 Switch 表達(dá)式
- Shenandoah GC 垃圾收集算法
- JMH 基準(zhǔn)測試
- G1 支持可中斷的 mixed GC,將 Mixed GC 拆分為強(qiáng)制部分和可選部分,強(qiáng)制部分一定會被回收,可選部分可以不被回收,這樣垃圾收集過程中優(yōu)先處理強(qiáng)制集,更容易滿足暫停時(shí)間目標(biāo)。
- G1 可以歸還不使用的內(nèi)存給操作系統(tǒng)
Java 13
- switch 優(yōu)化更新,增加 yield 關(guān)鍵字用于返回結(jié)果。
- ZGC 支持將未使用的內(nèi)存歸還操作系統(tǒng)
- 引入了文本塊,可以使用 """ 三個(gè)引號表示文本塊,示例代碼如下:
String html = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
Java 14
- instanceof 語法簡化,可以直接給對象賦值:
if (obj instanceof String s) {
//這里可以使用 s 變量
} else {
//這里不能使用 s 變量
}
- 引入 Record,類似于枚舉類型,具有 Lombok 功能,可以自動(dòng)生成構(gòu)造器、equals、getter 等方法。
- 放棄 CMS
Java 15
- 引入 hidden class
- String.substring 優(yōu)化,如果長度為 0,返回 null
- 引入 Sealed class
Java 16
- Stream新增toList方法
- 提供jpackage
- java.time 根據(jù)時(shí)段獲取時(shí)間
Java 17
- 升級 switch 使用,switch可直接用 instanceof 模式匹配選擇,不過需要提前做 null 判斷(下面代碼選自 oschina):
Object o;
switch (o) {
case null -> System.out.println("首先判斷對象是否為空,走空指針邏輯等后續(xù)邏輯");
case String s -> System.out.println("判斷是否為字符串,s:" + s);
case record p -> System.out.println("判斷是否為Record類型: " + p.toString());
case int[] arr -> System.out.println("判斷是否為數(shù)組,展示int數(shù)組的長度" + ia.length);
case Integer i -> System.out.println("判斷是否為Intger對象,i:" + i);
case Student s -> System.out.println("判斷是否為具體學(xué)生對象,student:" + s.toString());
case UserCommonService -> System.out.println("判斷是否為普通用戶實(shí)現(xiàn)類,然后走普通用戶邏輯");
case UserVipService -> System.out.println("判斷是否為vip用戶實(shí)現(xiàn)類,然后走vip用戶邏輯");
default -> System.out.println("Something else");
}
- 默認(rèn)啟用 Parallel GC
- 增強(qiáng)TreeMap
- 統(tǒng)一日志異步刷新,先將日志寫入緩存,獨(dú)立線程負(fù)責(zé)刷新到相應(yīng)輸出。
上面的版本只有 Java 11 和 Java 17 是 LTS(Long Term Support) 版本。
總結(jié)
全面擁抱 Java 17 還沒有真的到來,但已經(jīng)在路上了,作為程序員的我們應(yīng)該做準(zhǔn)備了。