Java8加java10等于Java18的版本查看及特性詳解
前言
Java 18正式發(fā)布, 雖然它不是長期支持 (LTS) 版本,但它卻實現了九個 JEP(在Java 18列出)。有哪些特性值得關注呢?
JEP 400
將 UTF-8 指定為標準 Java API 的默認字符集。通過此更改,依賴于默認字符集的 API 將在所有實現、操作系統(tǒng)、語言環(huán)境和配置中保持一致。
JEP 408
Java內部終于有原生的Web服務器了。但是請注意它沒有可用的 CGI 或類似 Servlet 的功能。該工具可用于原型設計、臨時編碼和測試目的,尤其是在教育環(huán)境中。
它并不是Jetty、Apache Tomcat等產品的競品,也無法而且不推薦在生產環(huán)境中使用。僅僅是提供一個命令行工具來輔助幫助開發(fā)人員設計、測試、教學。
JEP 413
支持在Java API文檔中使用代碼片段。以前在Java代碼的注釋中如果要寫一些樣例非常麻煩,甚至還要進行字符轉義?,F在Java注釋引入了一個新的標記 @snippet 來解決注釋中包含代碼片段樣例的問題。
它可以內聯使用:
/** * The following code shows how to use {@code Optional.isPresent}: * {@snippet : * if (v.isPresent()) { * System.out.println("v: " + v.get()); * } * } */
也可以引用外部片段:
/** * The following code shows how to use {@code Optional.isPresent}: * {@snippet file="ShowOptional.java" region="example"} */
ShowOptional.java就是它引用的源代碼:
public class ShowOptional { void show(Optional<String> v) { // @start region="example" if (v.isPresent()) { System.out.println("v: " + v.get()); } // @end } }
JEP 417
引入一個 API 來表達向量計算,該計算可以在運行時可靠地編譯為支持的 CPU 架構上的最佳向量指令,從而實現優(yōu)于等效標量計算的性能。 目前是第三次孵化。
JEP 418
為主機名和地址解析定義服務提供者接口 (SPI),以便java.net.InetAddress可以使用平臺內置解析器以外的解析器。 這個對于互聯網一些協(xié)議的接入提供了入口,同時你也可以對現有方案進行一些改進和定制。
JEP 419
Foreign Function & Memory API ( JEP 419 ) 是此版本中實現的更重要的 JEP 之一,因為它是Project Panama中包含的孵化組件之一。 Panama 正在簡化將 Java 程序連接到非 Java 組件的過程。這一特殊功能在其第二次孵化迭代中引入了一個 API,Java 程序通過該 API 調用Native類庫并處理Native數據。目的是取代設計的非常不理想的Java Native Interface (JNI)。
大家都知道其它語言有非常棒的一些類庫,但是Java想調用其它語言的類庫目前需要使用JNI。但是JNI被設計得太復雜了,讓很多Java開發(fā)者難以上手。如果這一狀況得到改變,那么利用Java去調用一些C或者C++音視頻處理庫和Python的機器學習庫將是非常容易的事情。
JEP 420
實現的唯一真正影響 Java 語言的 JEP 是Pattern Matching for switch ( JEP 420 ),它在 Java 17 中首次預覽(這是第二次預覽)。其目的是“通過對switch 表達式和語句的模式匹配以及對模式語言的擴展來增強 Java 編程語言 。在 Java 16 中,JEP 394擴展了instanceof運算符以采用類型模式并執(zhí)行模式匹配:
// Old code if (o instanceof String) { String s = (String)o; ... use s ... } // New code if (o instanceof String s) { ... use s ... }
我們使用instanceof后無需再對對象進行類型轉換就可以使用其真實的類型。
Java 14又引入了switch表達式:
int numLetters = switch (day) { case MONDAY, FRIDAY, SUNDAY -> 6; case TUESDAY -> 7; case THURSDAY, SATURDAY -> 8; case WEDNESDAY -> 9; default -> 11; };
如果這兩個能結合起來,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; }
JEP 420的預覽特性,將會把上面冗長的代碼簡化為:
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(); }; }
是不是更加清晰了呢?
JEP 421
Object對象有一個finalize方法,該方法用于實例被垃圾回收器回收的時觸發(fā)的操作。當 GC (垃圾回收器) 確定不存在對該對象的有更多引用時,對象的垃圾回收器就會調用這個方法。當時它的設計用來避免內存泄露,現在已經有了更好的替代方案try-with-resources和Java 9引入的 java.lang.ref.Cleaner 。
因此,所有該方法會被標記為過時,未來將被移除。
總結
很少有人在生產中使用 JDK 18,因為它不是 LTS 版本。去年九月發(fā)布JDK 17 LTS 版本更為重要,很多類庫,特別是Spring framework 6.0和Spring Boot 3.0 都將基于JDK17,你還要在Java 8堅持多久呢?已經相差了10個版本了。下一個是LTS是 2023 年 9 月的 Java 21。
以上就是Java 8加java10等于Java18版本要點詳解的詳細內容,更多關于Java8java10等于Java18版本的資料請關注腳本之家其它相關文章!
相關文章
SpringBoot 創(chuàng)建web項目并部署到外部Tomcat
本篇文章主要介紹了SpringBoot 創(chuàng)建web項目并部署到外部Tomcat,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06SpringCloud?Gateway?DispatcherHandler調用方法詳細介紹
我們第一個關注的類就是DispatcherHandler,這個類提供的handle()方法,封裝了我們之后所有的handlerMappings,這個DispatcherHandler有點想SpringMVC的DispatchServlet,里面也是封裝了請求和對應的處理方法的關系2022-10-10