勁爆!Java 18 正式發布,默認 UTF-8,finalize 被棄用。。別再亂用了!


上一版:重磅!JDK 17 發布,Oracle 宣布從 JDK 17 開始正式免費。。


JDK 18 正式發布

JDK 17 剛發布半年,JDK 18 又如期而至,JDK 版本號這算是成年了?

JDK 18 發布了,棧長繼續為大家解讀!

JDK 18 延續了 JDK 17 開創的免費策略,但,JDK 18~20 不是長期支持版本,注意不要用在生產。

最新 Oracle Java 支持路線圖:

JDK 18 新特性一覽

ID 特性 說明
1 400:UTF-8 by Default 默認 UTF-8
2 408:Simple Web Server 簡單 Web 服務器
3 413:Code Snippets in Java API Documentation 簡化文檔代碼片段
4 416:Reimplement Core Reflection with Method Handles 重新實現反射核心機制
5 417:Vector API (Third Incubator) 矢量 API(三次孵化中)
6 418:Internet-Address Resolution SPI 互聯網地址解析 SPI
7 419:Foreign Function & Memory API (Second Incubator) 外部函數和內存 API(二次孵化中)
8 420:Pattern Matching for switch (Second Preview) switch 模式匹配(二次預覽中)
9 421:Deprecate Finalization for Removal 棄用 Finalization

JDK 18 這個版本提供了 9 個增強功能,棧長接下來為大家一一解讀。

關注公眾號Java技術棧,持續分享最新、最主流的Java技術~

JDK 18 新特性詳細介紹

1、400:UTF-8 by Default

默認 UTF-8

沒錯,將 UTF-8 指定為標准 Java API 的默認字符集。

在 JDK 17 及更早版本中,默認字符集是在 Java 虛擬機運行時才確定的,取決於不同的操作系統、區域設置等因素,因此存在潛在的風險。

從這個版本開始,依賴於默認字符集的 API 會在所有實現、操作系統、語言環境和配置中保持一致。

可以使用以下命令查看當前 JDK 的默認字符集:

java -XshowSettings:properties -version 2>&1 | grep file.encoding
    file.encoding = UTF-8
    file.encoding.pkg = sun.io

在 JDK 中通過下面 API 獲取當前 JDK 的默認字符集:

Charset.defaultCharset()

我們都知道字符集一致的重要性,所有地方默認字符集保持一致真的非常有用。

2、408:Simple Web Server

簡單 Web 服務器

提供一個命令行工具啟動的迷你 Web 服務器:

$ 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/

只限於靜態文件,類似於 Apache、Nginx 的靜態服務器功能,不過它要更簡單,功能極少,設置簡單。

簡單的、臨時的測試用用我覺得還行,不用去額外下載和配置其他的服務器組件,以后用 Java 就能搞定了,有興趣的可以研究試用下!

3、413:Code Snippets in Java API Documentation

Java API 文檔中支持 Snippets 代碼片段

增加了 @snippet 標簽,簡化 API 文檔中包含示例源代碼的情況。

使用語法:

以前是這樣寫的:

/**
 * <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

重新實現反射核心機制(Method Handles)

JDK 18 使 Method Handles 作為反射的底層機制,重新實現了 java.lang.reflect.Method、Constructor、Field 組件,將大大降低反射 API 的維護和開發成本。

另外,最新最全的 Java 反射面試題整理好了,微信搜索Java面試庫小程序在線刷題。

5、417:Vector API (Third Incubator)

矢量 API(三次孵化中)

Vector API 這是一個新的初始迭代孵化器模塊,模塊包:jdk.incubator.vector,用於表示在運行時可靠地編譯到支持的 CPU 架構上的最佳矢量硬件指令的矢量計算,矢量運算可以提供優於等效標量計算的性能,並且在機器學習、人工智能和密碼學等領域非常普遍。

本次增強的 API 允許以一種在運行時,可靠地編譯為支持的 CPU 架構上的最佳向量指令的方式表達向量計算。

下個版本會轉正嗎?

6、418:Internet-Address Resolution SPI

互聯網地址解析 SPI

定義了一個全新的 SPI(service-provider interface),用於主要名稱和地址的解析,以便 java.net.InetAddress 可以使用平台之外的第三方解析器。

7、JEP 419: Foreign Function & Memory API (Second Incubator)

外部函數和內存 API(二次孵化中)

改進了 JDK 14JDK 15 引入的 API,通過有效調用外部函數(即 JVM 之外的代碼),以及安全地訪問外部內存(JVM 之外的內存),這些 API 可以調用本地庫和處理本地數據,與 Java 運行環境之外的代碼和數據進行交互。

8、JEP 420: Pattern Matching for switch (Second Preview)

switch 模式匹配(二次預覽中)

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 類型,這就等於同時支持多種類型,使用模式匹配得到具體類型,大大簡化了語法量,這個功能還是挺實用的,期待轉正,棧長會再詳細寫一篇,關注公眾號:Java技術棧,公眾號第一時間推送哦。

往期 Java 新特性教程可以去Java技術棧博客:

https://www.javastack.cn/categories/Java/

9、JEP 421: Deprecate Finalization for Removal

棄用 Finalization

如現在使用 finalize 方法:

已經標識為廢棄狀態了。。

finalize 大家應該都很清楚吧!

它可以幫助我們主動釋放系統底層資源,說實話,沒用過,Java 是自動管理內存的,使用它反而會導致潛在的系統安全風險,沒幫助不說反而是負擔,所以計划移除了。

Finalization 現在默認是開啟的,但可以通過下面參數進行禁用:

--finalization=disable

后續的版本會默認禁用,再逐步進行徹底刪除,我估計在下一個長期支持版本 JDK 21 中會徹底刪除。

不要再用 finalize 了,以后面試問 finalize 和 final、finally 的區別也要好好回答了。

可以考慮使用其他的資源管理技術,如:try-with-resources(JDK 7+) 和 cleaners(JDK 9+),關於這塊棧長會再詳細寫一篇,關注公眾號:Java技術棧,公眾號第一時間推送哦。

總結

本文主要介紹了 JDK/Java 18 的 9 個新特性基本面,雖然現在用不上,但了解和學習還是很有必要的,技術更新太快,不進則退。

另外,據最近的調查顯示,市面上的主流版本還是 JDK 8,其實是 JDK 11,但現在隨着 JDK 17+ 的免費,JDK 8 會逐漸被替代,JDK 17+ 會成為下一代主流版本。

最后,棧長有時間也會繼續更新一些 JDK 新特性詳細教程,關注公眾號Java技術棧第一時間推送哦。如果你想看歷史 Java 8+ 系列新特性教程,也可以在公眾號菜單中進行閱讀。

往期 Java 教程及示例源碼:

https://github.com/javastacks/javastack

Oracle JDK 18 下載地址:

https://www.oracle.com/java/technologies/javase-downloads.html

OpenJDK 18 下載地址:

https://jdk.java.net/18/

有興趣的可以下載嘗鮮了!!

老鐵們,點個在看、轉發支持下哦,也歡迎分享給你的更多朋友們~

關注Java技術棧,持續分享最新、最主流的Java技術~

版權聲明: 本文系公眾號 "Java技術棧" 原創,轉載、引用本文內容請注明出處,抄襲、洗稿一律投訴侵權,后果自負,並保留追究其法律責任的權利。

近期熱文推薦:

1.1,000+ 道 Java面試題及答案整理(2022最新版)

2.勁爆!Java 協程要來了。。。

3.Spring Boot 2.x 教程,太全了!

4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!

5.《Java開發手冊(嵩山版)》最新發布,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM