Java 18 正式发布,默认 UTF-8,finalize 被弃用,别再乱用了!
JDK 18 正式發(fā)布
JDK 17 剛發(fā)布半年,JDK 18 又如期而至,JDK 版本號這算是成年了?
JDK 18 發(fā)布了,棧長繼續(xù)為大家解讀!
JDK 18 延續(xù)了 JDK 17 開創(chuàng)的免費(fèi)策略,但,JDK 18~20 不是長期支持版本,注意不要用在生產(chǎn)。
最新 Oracle Java 支持路線圖:
JDK 18 新特性一覽
| 1 | 400:UTF-8 by Default | 默認(rèn) UTF-8 |
| 2 | 408:Simple Web Server | 簡單 Web 服務(wù)器 |
| 3 | 413:Code Snippets in Java API Documentation | 簡化文檔代碼片段 |
| 4 | 416:Reimplement Core Reflection with Method Handles | 重新實(shí)現(xiàn)反射核心機(jī)制 |
| 5 | 417:Vector API (Third Incubator) | 矢量 API(三次孵化中) |
| 6 | 418:Internet-Address Resolution SPI | 互聯(lián)網(wǎng)地址解析 SPI |
| 7 | 419:Foreign Function & Memory API (Second Incubator) | 外部函數(shù)和內(nèi)存 API(二次孵化中) |
| 8 | 420:Pattern Matching for switch (Second Preview) | switch 模式匹配(二次預(yù)覽中) |
| 9 | 421:Deprecate Finalization for Removal | 棄用 Finalization |
JDK 18 這個版本提供了 9 個增強(qiáng)功能,棧長接下來為大家一一解讀。
關(guān)注公眾號Java技術(shù)棧,持續(xù)分享最新、最主流的Java技術(shù)~
JDK 18 新特性詳細(xì)介紹
1、400:UTF-8 by Default
默認(rèn) UTF-8
沒錯,將 UTF-8 指定為標(biāo)準(zhǔn) Java API 的默認(rèn)字符集。
在 JDK 17 及更早版本中,默認(rèn)字符集是在 Java 虛擬機(jī)運(yùn)行時才確定的,取決于不同的操作系統(tǒng)、區(qū)域設(shè)置等因素,因此存在潛在的風(fēng)險。
從這個版本開始,依賴于默認(rèn)字符集的 API 會在所有實(shí)現(xiàn)、操作系統(tǒng)、語言環(huán)境和配置中保持一致。
可以使用以下命令查看當(dāng)前 JDK 的默認(rèn)字符集:
java?-XshowSettings:properties?-version?2>&1?|?grep?file.encodingfile.encoding?=?UTF-8file.encoding.pkg?=?sun.io在 JDK 中通過下面 API 獲取當(dāng)前 JDK 的默認(rèn)字符集:
Charset.defaultCharset()我們都知道字符集一致的重要性,所有地方默認(rèn)字符集保持一致真的非常有用。
2、408:Simple Web Server
簡單 Web 服務(wù)器
提供一個命令行工具啟動的迷你 Web 服務(wù)器:
$?jwebserver Binding?to?loopback?by?default.?For?all?interfaces?use?"-b?0.0.0.0"?or?"-b?::". Serving?/cwd?and?subdirectories?on?127.0.0.1?port?8000 URL:?http://127.0.0.1:8000/只限于靜態(tài)文件,類似于 Apache、Nginx 的靜態(tài)服務(wù)器功能,不過它要更簡單,功能極少,設(shè)置簡單。
簡單的、臨時的測試用用我覺得還行,不用去額外下載和配置其他的服務(wù)器組件,以后用 Java 就能搞定了,有興趣的可以研究試用下!
3、413:Code Snippets in Java API Documentation
Java API 文檔中支持 Snippets 代碼片段
增加了 @snippet 標(biāo)簽,簡化 API 文檔中包含示例源代碼的情況。
使用語法:
{@snippet ...}
以前是這樣寫的:
/***?<pre>{@code*?????String[]?y?=?x.toArray(new?String[0]);*?}</pre>**/JDK 18 中可以這樣:
/***?The?following?code?shows?how?to?use?{@code?Optional.isPresent}:*?{@snippet?:*?if?(v.isPresent())?{*?????System.out.println("v:?"?+?v.get());*?}*?}*/4、416:Reimplement Core Reflection with Method Handles
重新實(shí)現(xiàn)反射核心機(jī)制(Method Handles)
JDK 18 使 Method Handles 作為反射的底層機(jī)制,重新實(shí)現(xiàn)了 java.lang.reflect.Method、Constructor、Field 組件,將大大降低反射 API 的維護(hù)和開發(fā)成本。
另外,最新最全的?Java?面試題整理好了,大家可以在Java面試庫小程序在線刷題。
5、417:Vector API (Third Incubator)
矢量 API(三次孵化中)
Vector API 這是一個新的初始迭代孵化器模塊,模塊包:jdk.incubator.vector,用于表示在運(yùn)行時可靠地編譯到支持的 CPU 架構(gòu)上的最佳矢量硬件指令的矢量計算,矢量運(yùn)算可以提供優(yōu)于等效標(biāo)量計算的性能,并且在機(jī)器學(xué)習(xí)、人工智能和密碼學(xué)等領(lǐng)域非常普遍。
本次增強(qiáng)的 API 允許以一種在運(yùn)行時,可靠地編譯為支持的 CPU 架構(gòu)上的最佳向量指令的方式表達(dá)向量計算。
下個版本會轉(zhuǎn)正嗎?
6、418:Internet-Address Resolution SPI
互聯(lián)網(wǎng)地址解析 SPI
定義了一個全新的 SPI(service-provider interface),用于主要名稱和地址的解析,以便 java.net.InetAddress 可以使用平臺之外的第三方解析器。
7、JEP 419: Foreign Function & Memory API (Second Incubator)
外部函數(shù)和內(nèi)存 API(二次孵化中)
改進(jìn)了 JDK 14 和 JDK 15 引入的 API,通過有效調(diào)用外部函數(shù)(即 JVM 之外的代碼),以及安全地訪問外部內(nèi)存(JVM 之外的內(nèi)存),這些 API 可以調(diào)用本地庫和處理本地數(shù)據(jù),與 Java 運(yùn)行環(huán)境之外的代碼和數(shù)據(jù)進(jìn)行交互。
8、JEP 420: Pattern Matching for switch (Second Preview)
switch 模式匹配(二次預(yù)覽中)
instanceof 模式匹配的概念大家都清楚吧?不清楚的可以看下這篇文章:Java 14 之模式匹配,非常贊的一個新特性!
這次在 JDK 17 中為 switch 語句支持模式匹配,是個什么鬼?來看下面的示例!
老代碼寫法:
static?String?formatter(Object?o)?{String?formatted?=?"unknown";if?(o?instanceof?Integer?i)?{formatted?=?String.format("int?%d",?i);}?else?if?(o?instanceof?Long?l)?{formatted?=?String.format("long?%d",?l);}?else?if?(o?instanceof?Double?d)?{formatted?=?String.format("double?%f",?d);}?else?if?(o?instanceof?String?s)?{formatted?=?String.format("String?%s",?s);}return?formatted; }模式匹配新寫法:
static?String?formatterPatternSwitch(Object?o)?{return?switch?(o)?{case?Integer?i?->?String.format("int?%d",?i);case?Long?l????->?String.format("long?%d",?l);case?Double?d??->?String.format("double?%f",?d);case?String?s??->?String.format("String?%s",?s);default????????->?o.toString();}; }牛逼,直接在 switch 上支持 Object 類型,這就等于同時支持多種類型,使用模式匹配得到具體類型,大大簡化了語法量,這個功能還是挺實(shí)用的,期待轉(zhuǎn)正,棧長會再詳細(xì)寫一篇,關(guān)注公眾號:Java技術(shù)棧,公眾號第一時間推送哦。
往期 Java 新特性教程可以去Java技術(shù)棧博客:
https://www.javastack.cn/categories/Java/
9、JEP 421: Deprecate Finalization for Removal
棄用 Finalization
如現(xiàn)在使用 finalize 方法:
已經(jīng)標(biāo)識為廢棄狀態(tài)了。。
finalize 大家應(yīng)該都很清楚吧!
它可以幫助我們主動釋放系統(tǒng)底層資源,說實(shí)話,沒用過,Java 是自動管理內(nèi)存的,使用它反而會導(dǎo)致潛在的系統(tǒng)安全風(fēng)險,沒幫助不說反而是負(fù)擔(dān),所以計劃移除了。
Finalization 現(xiàn)在默認(rèn)是開啟的,但可以通過下面參數(shù)進(jìn)行禁用:
--finalization=disable
后續(xù)的版本會默認(rèn)禁用,再逐步進(jìn)行徹底刪除,我估計在下一個長期支持版本 JDK 21 中會徹底刪除。
不要再用 finalize 了,以后面試問 finalize 和 final、finally 的區(qū)別也要好好回答了。
可以考慮使用其他的資源管理技術(shù),如:try-with-resources(JDK 7+) 和 cleaners(JDK 9+),關(guān)于這塊棧長會再詳細(xì)寫一篇,關(guān)注公眾號:Java技術(shù)棧,公眾號第一時間推送哦。
總結(jié)
本文主要介紹了 JDK/Java 18 的 9 個新特性基本面,雖然現(xiàn)在用不上,但了解和學(xué)習(xí)還是很有必要的,技術(shù)更新太快,不進(jìn)則退。
另外,據(jù)最近的調(diào)查顯示,市面上的主流版本還是 JDK 8,其實(shí)是 JDK 11,但現(xiàn)在隨著 JDK 17+ 的免費(fèi),JDK 8 會逐漸被替代,JDK 17+ 會成為下一代主流版本。
往期推薦MySQL 精選 60 道面試題(含答案)
SpringCloud Ribbon中的7種負(fù)載均衡策略!
SpringCloud OpenFeign + Nacos正確打開方式!
總結(jié)
以上是生活随笔為你收集整理的Java 18 正式发布,默认 UTF-8,finalize 被弃用,别再乱用了!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 韩信大招:一致性哈希
- 下一篇: Java Double类shortVal