本文整理了 Java 8 至 Java 24 各版本的新特性,內容包括每個版本的新增功能分類(如語法增強、性能優化、工具支持等)、詳細的代碼示例,并結合官方文檔資料,分析每項特性的應用場景及優缺點。Java 8 發布于 2014 年,此后 Java 進入快速迭代模式,每半年發布一個新版本。一路走來,Java 8 到 Java 24 帶來了大量重要的新特性。
好的,以下是你提供的關于Java 6到Java 24的所有版本特性整理,保持了原內容的完整性和結構:
一覽圖
腦圖式內容參考
📅 Java 版本演進概覽
版本 | 發布日期 | 類型 | 主要改進領域 |
---|---|---|---|
8 | 2014 年 3 月 | LTS | Lambda、Stream API、默認方法等 |
9 | 2017 年 9 月 | 非 LTS | 模塊化系統、接口私有方法等 |
10 | 2018 年 3 月 | 非 LTS | var 關鍵字、集合工廠方法等 |
11 | 2018 年 9 月 | LTS | HTTP Client、ZGC 等 |
12 | 2019 年 3 月 | 非 LTS | Switch 表達式(預覽)、Shenandoah GC |
13 | 2019 年 9 月 | 非 LTS | 文本塊(Text Blocks)預覽 |
14 | 2020 年 3 月 | 非 LTS | Records、模式匹配(Pattern Matching) |
15 | 2020 年 9 月 | 非 LTS | Text Blocks 正式發布、ZGC 轉正 |
16 | 2021 年 3 月 | 非 LTS | Records 正式發布、Vector API 孵化 |
17 | 2021 年 9 月 | LTS | Sealed Classes、強封裝內部 API |
18 | 2022 年 3 月 | 非 LTS | UTF-8 默認編碼、jwebserver |
19 | 2022 年 9 月 | 非 LTS | Virtual Threads(預覽) |
20 | 2023 年 3 月 | 非 LTS | Structured Concurrency(孵化) |
21 | 2023 年 9 月 | LTS | Virtual Threads 正式發布、Sequenced Collections |
22 | 2024 年 3 月 | 非 LTS | 多文件源碼運行、構造函數前語句支持 |
23 | 2024 年 9 月 | 非 LTS | 原始類型模式匹配(預覽) |
24 | 2025 年 3 月 | 非 LTS | KDF API、類加載緩存、Stream Gatherer 正式發布 |
🔧 語言與語法增強
? Java 8
- Lambda 表達式:簡化匿名函數書寫。
- 函數式接口:如
Function
,Predicate
,Consumer
。 - 方法引用:
Class::method
語法。 - 默認方法和靜態方法:接口可以定義實現。
- 重復注解與類型注解:支持多次使用同一注解及在任意類型上標注。
? Java 9-10
- 私有接口方法:允許接口中定義私有方法。
- try-with-resources 改進:變量可復用。
- 局部變量類型推斷(var):
var list = new ArrayList<String>();
- 集合工廠方法:
List.of("a", "b")
? Java 11+
- 單文件運行:
java Hello.java
- 字符串增強:
isBlank()
,lines()
,repeat(int)
,strip()
等。 - 文本塊(Text Blocks):多行字符串,
""" ... """
。 - 記錄類(Record):不可變數據載體,自動生成構造器/equals/hashCode。
- 密封類(Sealed Class):限制子類繼承。
- 模式匹配(instanceof 和 switch):自動類型轉換 + 匹配結構。
- 未命名模式
_
:忽略不關心的部分。 - 字符串模板(STR.):內嵌表達式
${}
。
🧠 并發與虛擬線程
? Java 19 (Loom)
- 虛擬線程(Virtual Threads):輕量級線程,由 JVM 管理。
- 結構化并發(Structured Concurrency):任務并行管理。
- 作用域值(ScopedValue):替代 ThreadLocal 的更安全上下文傳遞方式。
? Java 21+
- 虛擬線程正式發布:可用于生產環境。
- 非 Pinning 鎖機制:虛擬線程在鎖等待時釋放 OS 線程。
📦 JVM 與性能優化
? 垃圾回收
- G1 成為默認 GC
- ZGC:低延遲,跨平臺支持。
- Shenandoah GC:低延遲垃圾收集器。
- Gen ZGC(Java 24):分代 ZGC 提升吞吐。
? 內存模型與工具
- 元空間(Metaspace):取代永久代。
- Vector API(孵化):SIMD 指令支持。
- Foreign Function & Memory API(Panama):調用本地函數、訪問內存。
- 類加載緩存(Java 24):加速應用啟動。
🧪 核心庫增強
? 集合框架
- Stream API:聲明式編程風格。
- Optional 類:避免空指針異常。
- Map 增強:
computeIfAbsent
、merge
等。 - Sequenced Collections(Java 21):有序集合接口族。
? IO 與網絡
- Files.readString/writeString:簡化文件操作。
- HttpClient(Java 11):支持 HTTP/2 和 WebSocket。
- Socket API 重構:性能與可維護性提升。
? 時間與隨機數
- 全新的時間 API(java.time):線程安全、不變對象。
- 偽隨機數生成器(Java 17):多種算法支持。
🛡? 安全與密碼學
- TLS 1.3 支持(Java 11)
- EdDSA 加密算法(Java 15)
- KDF API(Java 24 預覽):統一的密鑰派生接口。
- SecurityManager 移除(Java 24):徹底禁用安全管理器。
🧰 工具鏈與生態
- JShell(Java 9):交互式 REPL 工具。
- jlink(Java 9):構建定制運行時鏡像。
- jpackage(Java 16):打包原生安裝包。
- JMH(Java 10):微基準測試框架。
- Markdown JavaDoc(Java 23):支持 Markdown 編寫文檔注釋。
📚 模塊化與兼容性
- 模塊化系統(Java 9):Project Jigsaw。
- 多版本 JAR:支持不同 Java 版本共存。
- AppCDS 動態歸檔(Java 13):提升啟動性能。
- 棄用 Nashorn(Java 15):推薦使用 GraalJS。
📈 總結
方向 | 演進成果 |
---|---|
語言現代化 | 引入 lambda、record、sealed class、pattern matching 等,代碼更簡潔易讀。 |
并發模型升級 | 虛擬線程 + 結構化并發,極大提升高并發處理能力。 |
性能優化 | 新一代 GC(ZGC、Shenandoah)、Vector API、FFM API 等底層性能突破。 |
標準庫擴展 | Stream API、Optional、HttpClient、Text Blocks 等增強開發者體驗。 |
安全性增強 | TLS 1.3、EdDSA、KDF API 提供現代加密能力。 |
工具鏈完善 | JShell、jpackage、jlink、JMH 等工具助力開發調試與部署。 |
📌 參考文獻
- OpenJDK 官方 JEP 列表
- Oracle Blog: Java Language Futures
- JetBrains IDEA 官方文檔
? 建議閱讀順序
- Java 8 → 11:掌握基礎語法、Stream、Optional、HTTP Client。
- Java 14 → 17:學習 Record、Sealed Class、Pattern Matching。
- Java 19 → 21:了解 Loom 項目(虛擬線程、結構化并發)。
- Java 22 → 24:關注流收集器、類文件 API、KDF API 等高級特性。
📌 適合人群
- 初學者:建議從 Java 8 入門,逐步過渡到 Java 11。
- 中級開發者:應掌握 Java 14+ 的 record、pattern matching。
- 高級開發者 / 架構師:需深入理解虛擬線程、FFM API、Vector API 等底層機制。
Java 8 新特性
發行時間:2014 年 3 月
語言特性
-
Lambda 表達式與函數式接口:
- Java 8 引入了 Lambda 表達式,使我們能夠將匿名函數作為一等公民傳遞和使用。
- 例如,可以使用
Comparator<String> cmp = (a, b) -> a.length() - b.length();
來實現字符串長度比較。 - 這依賴于函數式接口(只含單一抽象方法的接口),如
Comparator
或自定義接口,Lambda 會被推斷成該接口的實現。 - 有了 Lambda,代碼變得更加簡潔,可讀性提高,尤其適用于集合的過濾、映射等操作。
// 示例:使用 Lambda 表達式對列表進行過濾和映射 List<String> names = Arrays.asList("Alice", "Bob", "Ann"); List<String> filtered = names.stream().filter(s -> s.startsWith("A")).map(s -> s.toUpperCase()).collect(Collectors.toList()); System.out.println(filtered); // 輸出: [ALICE, ANN]
-
方法引用:
- 除了 Lambda,Java 8 還支持方法引用,可以用
Class::method
簡潔地引用已有方法或構造器。 - 例如,
names.forEach(System.out::println)
會打印列表中每個元素,相當于對每個元素執行System.out.println
。
- 除了 Lambda,Java 8 還支持方法引用,可以用
-
接口默認方法和靜態方法:
- 接口現在可以包含帶實現的默認方法(
default
方法)和靜態方法。 - 這使得在不破壞已有實現類的前提下向接口添加新方法成為可能。
- 默認方法可被實現類繼承或重寫;靜態方法則只能通過接口名調用,不能被子類重寫。
interface MyInterface {static void staticMethod() {System.out.println("接口靜態方法");}default void defaultMethod() {System.out.println("接口默認方法");}void abstractMethod(); }class MyClass implements MyInterface {@Overridepublic void abstractMethod() { }// 未重寫 defaultMethod(),將繼承接口的默認實現 }MyInterface.staticMethod(); // 調用接口靜態方法 new MyClass().defaultMethod(); // 調用接口默認方法,實現類未重寫則執行接口中的實現
- 應用場景:默認方法解決了接口演化的問題,比如 Java 8 為 Collection 接口添加了 stream() 默認方法,從而所有實現類無需修改就自動擁有流操作能力。靜態方法則方便在接口中組織工具函數。
- 接口現在可以包含帶實現的默認方法(
-
重復注解(Repeatable Annotation):
- 允許在同一聲明或類型上多次應用同一個注解類型。
- Java 8 引入了
@Repeatable
元注解,通過定義“容器注解”類型來實現重復注解支持。 - 應用場景如定義多個過濾器、多個權限注解等,使代碼更直觀。
@Schedule(day="Mon"), @Schedule(day="Tue") void scheduledTask() { ... }
-
類型注解:
- Java 8 擴展了注解使用的場景,注解現在可以加在任何類型使用處(Type Use),如泛型類型參數、強制轉換、實現聲明等。
- 結合 JSR 308,可用于開發更強的類型檢查工具(如空指針分析)。
核心庫新特性
-
Stream API:
- Java 8 的 Stream API 為集合批量操作提供了聲明式、鏈式的語法。
- 開發者可以使用類似 SQL 風格的操作(filter, map, reduce 等)來處理數據流。
- Stream 的操作分為中間操作(惰性求值)和終止操作(觸發計算)。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); int sum = numbers.stream().filter(n -> n % 2 == 1) // 篩選奇數.mapToInt(n -> n * n) // 平方映射.sum(); // 終止操作求和 System.out.println(sum); // 輸出: 35(1^2 + 3^2 + 5^2)
- 應用場景:Stream API 大大簡化了集合的復雜操作,避免了繁瑣的迭代和臨時集合管理。例如,可以輕松進行過濾、匯總統計、分組分區等操作。
-
Optional 類:
- 引入了
java.util.Optional<T>
,用于優雅地表示“可能為空”的值。 - Optional 提供了諸如
isPresent()
,ifPresent()
,orElse()
等方法,可以替代顯式的空檢查,減少空指針異常風險。
public Optional<User> findUser(String name) {User result = ... // 查找用戶return Optional.ofNullable(result); }// 使用Optional避免顯式null判斷 findUser("Alice").ifPresent(user -> System.out.println(user.getId())); User user = findUser("Bob").orElse(new User("Bob")); // 未找到則返回默認User
- 應用場景:Optional 常用于方法返回值,表示“可能沒有結果”。這比返回 null 更具語義,也迫使調用方處理不存在的情況。
- 引入了
-
全新的日期時間 API:
- Java 8 推出了
java.time
包(JSR 310),提供了不變且線程安全的日期時間類,包括 LocalDate, LocalTime, LocalDateTime, ZonedDateTime 等,以及用于周期和持續時間的 Period, Duration。 - 新的 API 改進了舊版
java.util.Date
和Calendar
的諸多問題,提供了更加自然的時間操作接口。
LocalDate today = LocalDate.now(); LocalDate birthday = LocalDate.of(1990, Month.APRIL, 1); Period period = Period.between(birthday, today); System.out.printf("年齡: %d 年 %d 月 %d 日%n", period.getYears(), period.getMonths(), period.getDays());
- 應用場景:新日期API提供了清晰的方法來操作日期時間,支持時區、夏令時、安全不變。此外還提供了格式化和解析(DateTimeFormatter),大幅簡化日期處理,避免了舊 API 各種不一致和缺陷。
- Java 8 推出了
-
并發增強(CompletableFuture 等):
- Java 8 在并發庫方面增加了
CompletableFuture
,支持以鏈式回調的方式處理異步結果,實現了Promise模式。 - 例如可以組合多個異步計算、設置依賴和異常處理。
- Java 8 在并發庫方面增加了
-
其它常用庫改進:
- 例如
Map.computeIfAbsent
等函數式風格的方法,方便地對 Map 執行條件更新;Base64 編碼解碼器(java.util.Base64)也在 Java 8 加入成為標準庫。
- 例如
JVM 與性能優化
-
永久代移除:
- Java 8 移除了 HotSpot VM 的永久代(PermGen),取而代之的是元空間(Metaspace)。
- 元空間在本地內存中分配且按需增長,大幅減少了因固定永久代空間不足導致的 OutOfMemoryError 情況,提高了內存管理的靈活性。
-
垃圾回收優化:
- Java 8 中雖然默認垃圾回收器仍是 Parallel GC,但引入了一些改進。
- 例如引入串行/并行 Full GC 等優化;此外為 G1 垃圾收集器(實驗性)打下基礎。
-
HashMap 性能改進:
- 為了應對哈希碰撞,Java 8 改進了 HashMap 和 ConcurrentHashMap 的實現。
- 當桶中鏈表長度超過閾值時,將鏈表轉換為紅黑樹存儲,從平均 O(n) 查找降為 O(log n)。
工具和其他
-
Nashorn JavaScript 引擎:
- Java 8 內置了全新的 JavaScript 引擎 Nashorn,替代了原有的 Rhino 引擎。
-
增強的注解處理和反射:
- Java 8 對反射和注解處理也有一些改進。
總結
Java 8 是一個里程碑版本,引入的 Lambda 和 Stream 等特性使 Java 正式進入函數式編程時代。默認方法等特性改善了接口演進能力。核心庫的加強和全新時間 API 填補了多年痛點。在性能上,永久代的移除和集合優化提升了穩定性。Java 8 的諸多新功能為之后的 Java 版本奠定了基礎,也是目前許多項目仍在使用的版本。
Java 9 新特性
發行時間:2017 年 9 月
語言和語法增強
-
模塊化系統(Project Jigsaw):
- Java 9 最重要的變化是引入模塊化系統。JDK 本身被重組為約 94 個模塊,允許按需組合所需模塊來構建定制的 Java 運行時(可使用下面提到的 jlink 工具)。
- 開發者可以通過創建模塊描述符
module-info.java
將應用拆分為模塊。模塊定義了所包含的包以及導出的內容和所需依賴,例如:
// module-info.java 示例 module com.example.app {requires com.example.utils; // 聲明依賴模塊exports com.example.app.api; // 導出包供其他模塊使用 }
-
模塊系統解決了 classpath 下包命名沖突和封裝不嚴的問題,實現強封裝。只有模塊導出的包才能被外部訪問,未導出的內部實現包將被嚴格封裝。這樣提高了代碼的可維護性和安全性。
-
應用場景: 大型應用可以通過模塊劃分更好地管理依賴關系,同時在部署時使用 jlink 剔除無關模塊減小體積。不過模塊化也帶來了學習曲線,且現有項目遷移需要調整訪問限制(可以通過 --add-exports 等選項做兼容)。
-
接口私有方法:
- 除了 Java 8 的接口默認方法外,Java 9 支持接口定義私有方法來給多個默認方法復用業務邏輯。這提高了接口內部實現的封裝性,避免默認方法之間代碼重復。私有接口方法只能在接口內部被默認或靜態方法調用,不會暴露給實現類。
-
try-with-resources 改進:
try-with-resources
語法在 Java 9 更加方便。現在如果已有實現AutoCloseable
的資源對象(final或 effectively final),可以直接在 try 語句中使用該變量,而不必再次聲明。
// Java 8 及之前需要在 try 內新聲明 try (BufferedReader br = Files.newBufferedReader(path)) { ... }// Java 9 可以在 try 中直接使用已有的變量 br BufferedReader br = Files.newBufferedReader(path); try (br) {// 使用 br 讀取... }
- 這減少了不必要的代碼臃腫,讓語法更簡潔。
核心庫增強
-
集合工廠方法:
-
Java 9 為集合接口添加了方便創建不可變集合的靜態工廠方法。例如:
List.of(1,2,3)
,Set.of("a","b")
,Map.of("key1","val1","key2","val2")
等,可以快捷地創建包含固定元素的集合。這些集合是不可修改的(修改會拋異常)。 -
應用場景: 用于快速創建常量集合、簡化測試用例數據準備等。
-
-
Stream API 改進:
-
Java 9 為 Stream 增加了一些實用的新方法,如
takeWhile
,dropWhile
和ofNullable
等。其中takeWhile(predicate)
會從 Stream 開頭起連續獲取滿足條件的元素,直到遇到不滿足條件者停止;dropWhile(predicate)
則丟棄開頭連續滿足條件的元素。 -
還有
Stream.iterate
支持提供斷言來結束迭代。
Stream.of(1, 2, 3, 4, 5).takeWhile(n -> n < 4); // 得到 [1, 2, 3] Stream.of(1, 2, 3, 4, 5).dropWhile(n -> n < 4); // 得到 [4, 5] Stream.iterate(1, x -> x + 1).takeWhile(x -> x <= 5).forEach(System.out::println);
- 此外,Optional 也增加了
ifPresentOrElse
,or
等方法,提高 Optional 的易用性。這些改進讓流操作和 Optional 更加完備,減少手動處理。
-
-
進程 API:
- 新增
ProcessHandle
接口,提供了更現代的進程管理 API。通過ProcessHandle.current()
可以獲取當前進程信息,包括 PID 等;還能列出現有進程,觀察進程樹關系,設置監聽等。
ProcessHandle self = ProcessHandle.current(); long pid = self.pid(); self.info().command().ifPresent(cmd -> System.out.println("命令: " + cmd));
- 這在需要監控或管理操作系統進程的應用中非常有用,如實現自定義的進程守護、獲取子進程退出事件等。
- 新增
-
響應式流(Reactive Streams):
-
Java 9 在
java.util.concurrent
下引入了發布-訂閱框架:Flow API,包括Flow.Publisher
,Subscriber
,Subscription
,Processor
四個接口。這實際上與 Reactive Streams 標準兼容,為反應式編程提供背壓(backpressure)支持。 -
雖然Java 9沒有提供具體實現,但像 RxJava、Akka Streams 等庫可直接與這套接口集成。應用在需要異步數據流且要考慮消費速率的場景。
-
-
HTTP/2 客戶端(孵化):
- Java 9 引入了一個新的 HTTP 客戶端 API 的孵化版本(位于
jdk.incubator.httpclient
模塊),支持 HTTP/2 和 WebSocket。雖然后來在 Java 11 才正式成為標準 API,這里值得一提。這個新客戶端支持異步非阻塞調用,比舊的HttpURLConnection
更易用、性能更佳。
- Java 9 引入了一個新的 HTTP 客戶端 API 的孵化版本(位于
JVM 和性能
-
G1 成為默認 GC:
-
Java 9 將 G1 垃圾收集器設置為默認垃圾回收器,取代了之前的 Parallel Scavenge/Parallel Old 組合。G1(Garbage First)是一種低暫停收集器,擅長處理大堆內存,盡量避免了全堆的長時間停頓。
-
在 Java 9 中,G1 的 Full GC 仍是單線程的,因此極端情況下可能出現長暫停。對此在 Java 10 又做了并行化改進。
-
應用場景: 對延遲敏感的服務,可從默認使用 G1 中獲益(前提是仔細調優以適應應用負載)。
-
-
字符串存儲優化:
-
Java 9 引入了 Compact Strings,即在內部用 byte 數組存儲字符串字符(Latin-1 和 UTF-16 動態選擇),而不再總是用 char 數組。對于只包含 ASCII 的字符串,可節省一半內存。
-
這個改動對開發者透明,但在字符串處理密集的應用中降低了內存占用,提高了 CPU 緩存利用率。
-
-
AOT 編譯(實驗):
-
新增了
jaotc
工具,允許將 Java 類提前編譯為本地代碼(Ahead-Of-Time)。AOT 編譯器基于 Graal,可生成本地庫,在應用啟動時加載,從而加快啟動速度。 -
不過這是實驗性功能,實際使用較少,在后續版本中也被移除。場景:需要極致優化啟動時間的場合可以探索,但一般而言 JIT 已經足夠。
-
-
VarHandle 和內存柵欄:
-
Java 9 提供了
java.lang.invoke.VarHandle
類,作為對sun.misc.Unsafe
的更安全替代。VarHandle 可以視作特定變量的引用,支持原子操作和內存可見性控制,比如讀取寫入內存柵欄(類似于 C++ 中的std::atomic
)。 -
這為開發并發框架、實現鎖自由算法提供了標準化的工具。
-
-
多版本 JAR:
-
支持多版本 JAR 文件,即在一個 JAR 中根據不同 Java 版本包含不同的類實現(通過
META-INF/versions
目錄)。運行時將選擇匹配當前 JVM 版本的類,實現庫對新舊版本的兼容發布。 -
例如,你可以在 JAR 中同時包含 Java 8 的實現和利用 Java 9 特性的實現。這樣第三方庫可以漸進地利用新特性,同時不失對舊版本的支持。
-
工具與其他
-
JShell:
- Java 9 帶來了官方的交互式 REPL 工具 JShell。開發者可以在不創建類和 main 方法的情況下,直接輸入 Java 表達式或語句,即時查看執行結果。
jshell> int x = 5 * 20 x ==> 100 jshell> "hello, " + "jshell" $2 ==> "hello, jshell"
- JShell 極大地方便了試驗性編程和學習。可以用它快速驗證一段邏輯、探索 API 用法等,降低了寫一個 Hello World 的門檻。對于教學、原型開發非常實用。
-
jlink:
-
Java 9 引入了
jlink
工具,可以根據模塊依賴創建自定義的精簡運行時鏡像。開發者指定應用模塊后,jlink 會打包只包含所需模塊的最小化 JRE。 -
這對于發布自包含的 Java 應用很有幫助,特別是在容器、物聯網設備上,可減少體積并避免目標環境需要預裝完整 JDK。
-
-
JUnit 5 等生態升級:
- 隨著 Java 9 發布,測試框架 JUnit 也升級到 5,支持 Java 8+ 特性如 Lambda 斷言等。這雖不是 JDK 自帶,但與語言新特性配套出現,標志著 Java 生態正擁抱新版本。
總結
Java 9 通過模塊系統對 Java 平臺進行了結構性革新。雖然社區對模塊化褒貶不一,但不可否認它提高了代碼封裝和定制部署能力。除此之外,Java 9 在語法上小幅改進(私有接口方法、鉆石操作符支持匿名類等未提及細節),在 API 和工具上為開發者提供了許多便捷,如 JShell、集合工廠等。它為之后的版本鋪平了道路,標志著 Java 進入了快速發布的新時代。
Java 10 新特性
發行時間:2018 年 3 月
語言特性
-
局部變量類型推斷(var):
- Java 10 最引人注目的特性是引入了新的關鍵字
var
,用于局部變量類型推斷。開發者在定義局部變量時,可以用var
代替具體類型,編譯器會根據初始化表達式自動推斷類型:
var list = new ArrayList<String>(); var sum = 0; for (var item : list) {// 在循環中,item 的類型也會被推斷 }
-
在上述代碼中,編譯器會推斷出
list
的類型為ArrayList<String>
,sum
的類型為int
。注意:var
不是動態類型或弱類型,Java 類型系統仍是靜態的,只是讓編譯器替我們填寫類型。 -
應用場景:
var
可減少樣板代碼,特別是當類型本身冗長(如泛型嵌套)時。
- Java 10 最引人注目的特性是引入了新的關鍵字
核心庫增強
-
不可變集合拷貝:
- 在 Java 9 提供集合工廠方法基礎上,Java 10 為集合增加了
List.copyOf
,Set.copyOf
,Map.copyOf
靜態方法。這些方法會返回傳入集合的不可變拷貝。
List<String> src = new ArrayList<>(List.of("a", "b")); List<String> copy = List.copyOf(src); src.add("c"); System.out.println(copy); // 輸出 [a, b],copy 不受原列表修改影響
- 應用場景:當需要確保集合不被修改時,可以方便地獲取其不可變版本。
- 在 Java 9 提供集合工廠方法基礎上,Java 10 為集合增加了
-
Optional 增強:
- Java 10 為 Optional 新增了
orElseThrow()
方法,它等價于.orElseThrow(NoSuchElementException::new)
。此外還引入了Optional.or(() -> alternativeOptional)
來在當前 Optional 為空時提供另一個 Optional。
- Java 10 為 Optional 新增了
-
并行垃圾回收器接口:
- 引入
java.lang.ref.Cleaner
提供替代finalize()
的清理機制。盡管不直接屬于核心“庫”,但 Java 10 重新整理了垃圾收集器的內部接口,將不同 GC 實現的共性提取出來。
- 引入
性能和 JVM 改進
-
G1 并行 Full GC:
- Java 10 通過 JEP 307 實現了 G1 Full GC 并行化。現在當 G1 不得不觸發 Full GC 時,會使用多個線程并行標記清除,減少停頓時間。
-
應用類數據共享(AppCDS):
- Java 10 通過 JEP 310 將 CDS 擴展到應用層面,允許應用類也加入共享歸檔。
-
線程局部握手(Thread Local Handshake):
- Java 10 改進了 JVM 停止線程執行的機制。
-
備用內存設備上的堆:
- 允許 JVM 將 Java 堆分配在非主內存設備上(如 NVDIMM 持久內存)。
工具和平臺
-
實驗性 Java JIT 編譯器 - Graal:
- Java 10 將基于 Java 實現的 JIT 編譯器 Graal 引入為實驗性選項。
-
根證書開源:
- Oracle 將 JDK 內置的 root CA 證書庫開源,替代以前 Oracle JDK 與 OpenJDK 差異的一部分。
總結
雖然 Java 10 屬于非 LTS 的短期版本,但引入的 var
關鍵字極大地簡化了日常編碼。集合、Optional 的小改進也增強了標準庫的便利性。在性能方面,G1 并行 Full GC、AppCDS 都是偏底層卻意義重大的優化,讓 Java 在大內存和大規模部署場景下表現更好。Java 10 還預示了未來的發展方向,如 Graal 編譯器的引入為后續多語言支持鋪路。
Java 11 新特性
發行時間:2018 年 9 月 25 日 (LTS長期支持版)
語言特性
-
Lambda 參數的局部變量語法:
- Java 11 允許在 Lambda 表達式的參數中使用局部變量語法,即可以用
var
來聲明參數類型。
Comparator<String> cmp = (var a, var b) -> Integer.compare(a.length(), b.length());
- 這對 Lambda 本身功能沒有變化,但允許我們添加參數注解時更方便。
- Java 11 允許在 Lambda 表達式的參數中使用局部變量語法,即可以用
-
直接啟動單文件程序:
-
Java 11 可以直接運行單個 Java 源文件,命令如:
java Hello.java
。Java 編譯器會隱式地先編譯這個源文件再執行。 -
應用場景:這一特性降低了 Java 的入門門檻和使用 Java 編寫腳本的成本。
-
核心庫增強
-
標準化 HTTP 客戶端:
- Java 11 將新 HTTP 客戶端 API 正式加入標準庫(位于
java.net.http
包)。
HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder(new URI("https://api.github.com")).header("Accept", "application/json").GET().build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body());
- 應用場景:調用 REST 服務、執行 HTTP 請求等在企業開發中很常見,新 API 提高了開發效率。
- Java 11 將新 HTTP 客戶端 API 正式加入標準庫(位于
-
字符串 API 增強:
- Java 11 對 String 添加了若干實用方法:
isBlank()
:判斷字符串是否為空白(空串或只含空白字符)。strip()
:類似 trim(),但能正確處理 Unicode 空白。repeat(int count)
:重復當前字符串 count 次,返回新串。lines()
:將字符串按行拆分為一個流(Stream)。
- Java 11 對 String 添加了若干實用方法:
-
TLS 1.3 支持:
- 實現了 TLS 1.3 協議,將安全套接字協議升級到最新標準。
性能與內存
-
ZGC(可伸縮低延遲 GC):
- Java 11 引入了實驗性的 Z Garbage Collector (ZGC)。
-
Epsilon GC:
- 另一個實驗性 GC —— Epsilon 也在 Java 11 中提供。
-
低開銷 Heap Profiling:
- 引入了一種低開銷的堆采樣機制。
-
Flight Recorder 開源:
- 商業 JDK 中的 Java Flight Recorder (JFR) 在 Java 11 正式開源納入 OpenJDK。
總結
作為長期支持版本,Java 11 集大成,鞏固了 Java 9 和 10 的變化并提供了一些關鍵的新功能。HttpClient 的正式加入填補了長期以來標準庫缺乏現代 HTTP 客戶端的空白。一系列細小的 API 改進提升了日常開發體驗。ZGC 等革新的 GC 技術雖然仍是實驗性質,但展現了 Java 在大內存低延遲領域的潛力。Java 11 開源了之前商用的 JFR,統一了 Oracle JDK 和 OpenJDK 的差異,這對 Java 生態意義重大。
Java 12 新特性
發行時間:2019 年 3 月
語言特性(預覽)
-
Switch 表達式(預覽):
- Java 12 對 switch 進行了增強,推出了 Switch 表達式 作為預覽特性。它允許 switch 直接返回值并使用簡潔的“箭頭語法”或 yield 語句,避免了繁瑣的 break。
int numDays = switch(day) {case MON, FRI, SUN -> 6;case TUE -> 7;case THU, SAT -> 8;case WED -> 9;default -> { System.out.println("Unknown day: " + day); yield 0;} };
-
Instanceof 模式匹配(預覽):
- Java 12 引入了模式匹配的 instanceof(同為預覽特性)。簡化了在進行類型檢查后再強制轉換的常見模式。
if (obj instanceof String str) {// 進入此塊則自動完成類型轉換,可直接使用 strSystem.out.println(str.toUpperCase()); }
核心庫增強
-
String 新方法:
- Java 12 為 String 添加了兩個方便的方法:
String.indent(int n)
:調整字符串每行的縮進。String.transform(Function<String,R> f)
:將字符串通過給定的函數轉換為另一種對象。
- Java 12 為 String 添加了兩個方便的方法:
-
Files.mismatch:
- 在
java.nio.file.Files
中新增了Files.mismatch(Path, Path)
方法,用于高效比較兩個文件的內容是否相同。
- 在
-
NumberFormat 壓縮數字:
java.text.NumberFormat
新增了緊湊數字格式(Compact Number Formatting)。
-
Collector.Teeing:
- Java 12增加了一個很有用的 Collector:
Collectors.teeing
,可以讓流拆分成兩個子流,各自收集后再合并結果。
- Java 12增加了一個很有用的 Collector:
JVM 與垃圾回收
-
Shenandoah GC:
- 由 RedHat 開發的低停頓垃圾收集器 Shenandoah 在 Java 12 正式引入(實驗性)。
-
G1 優化:
- Java 12 對默認 GC G1 進行了一些改進。
工具和其他
-
Microbenchmark Harness(試驗):
- Java 12 引入了一個基于 Java 的微基準測試框架(JEP 230)。
-
JVM 常量 API:
- 提供了一套新的
java.lang.invoke.ConstantBootstraps
API,用于在字節碼中加載動態常量(JEP 309)。
- 提供了一套新的
總結
Java 12 屬于過渡版本,但預示了 Java 語言幾個重要演進方向:Switch 表達式和模式匹配都是為了讓 Java 語法更簡潔、更強大。核心庫的小改進(字符串 indent/transform 等)貼近開發者需求,讓日常編碼更高效。Shenandoah GC 等則體現了 Java 在 GC 領域的持續創新,和 ZGC 一起為低延遲場景提供了解決方案。
Java 13 新特性
發行時間:2019 年 9 月
語言特性(預覽)
-
文本塊(Text Blocks,預覽):
- Java 13 引入了文本塊作為預覽特性。文本塊使用三重引號
"""
包圍多行字符串文字,支持保持代碼中的排版格式,大大簡化了多行字符串的書寫。
String json = """{"name": "Alice","age": 25} """;
- Java 13 引入了文本塊作為預覽特性。文本塊使用三重引號
-
Switch 表達式第二次預覽:
- Java 13 對上一版的 Switch 表達式進行了改進,主要是引入了 yield 關鍵字來返回值而不是使用 break。
String result = switch(day) {case MON, TUE, WED, THU, FRI: yield "Workday";case SAT, SUN: yield "Weekend";default: yield "Invalid"; };
核心庫與其他
-
ZGC 改進:
- Java 13 改善了 ZGC,讓其在空閑時能夠將未使用的堆內存歸還操作系統。
-
Socket API 重構:
- Java 13 底層重寫了傳統 Socket 實現,引入 NioSocketImpl 取代舊的 PlainSocketImpl。
-
動態 CDS 歸檔:
- Java 13 延伸了在 Java 10 引入的 AppCDS 功能,加入了動態類數據歸檔能力。
總結
Java 13 延續了預覽新特性的打磨,文本塊讓多行字符串處理在 Java 中首次變得愉悅;Switch 表達式朝著最終定稿又邁進一步。雖然沒有正式定稿的新語法,但這些預覽特性在社區中引起了極大興趣。底層方面,Socket API 的重構和 ZGC 的完善提高了性能和資源利用率。
Java 14 新特性
發行時間:2020 年 3 月
JVM 改進
-
空指針異常詳細提示:
- Java 14 對長期困擾開發者的 NullPointerException 進行了改進。當發生 NPE 時,錯誤信息現在會指出具體哪個變量為空。
-
Switch 表達式正式推出:
- 經過兩個版本的預覽,增強型 switch 在 Java 14 正式成為 Java 語言的一部分。
-
記錄類(預覽):
- Java 14 引入了一種全新的類型聲明:記錄類(Record),作為預覽特性。
public record Point(int x, int y) { }
-
文本塊(第二次預覽):
- 文本塊在 Java 14 繼續預覽,引入了新的轉義。
-
instanceof 模式匹配(第二次預覽):
- Java 14 中,instanceof 模式匹配作為預覽再次出現。
核心庫和工具
-
移除過時的 CMS GC:
- 并發標記清除(CMS)垃圾收集器自 Java 9 起棄用后,終于在 Java 14 中移除。
-
ZGC 擴展到 macOS/Windows:
- Java 14 將 ZGC 從僅支持 Linux 擴展到了 macOS 和 Windows 平臺。
-
jpackage 工具(孵化):
- 提供了 jpackage 工具的早期版本,可將 Java 應用打包成原生安裝包。
總結
Java 14 是一個內容相當豐富的版本。Switch 表達式終于定型、記錄類和模式匹配開始嶄露頭角。這些語言層面的增強讓 Java 變得更簡潔和富有表達力,逐步擺脫“樣板代碼多”的詬病。
Java 15 新特性
發行時間:2020 年 9 月
核心語言特性
-
文本塊正式發布:
- 經過兩次預覽,Text Blocks 在 Java 15 成為正式特性。
-
密封類(預覽):
- Java 15 引入了密封類和密封接口(Sealed Classes)作為預覽特性。
public sealed class Person permits Employee, Manager { }
-
隱藏類(Hidden Classes):
- Java 15 加入了一種專門面向框架、JVM內部使用的類加載功能:隱藏類。
核心庫與安全
-
新增 CharSequence.isEmpty():
- 在 Java 15,CharSequence 接口添加了默認方法 isEmpty()。
-
增強 TreeMap:
- Java 15 為 java.util.TreeMap 增補了多個常用方法。
-
新的數字簽名算法 EdDSA:
- Java 15 實現了 Edwards-Curve 數字簽名算法(EdDSA)。
JVM 和性能
-
ZGC 轉正:
- ZGC 在 Java 15 終于結束了實驗狀態,變為生產可用的垃圾收集器。
-
棄用 Nashorn:
- Java 15 正式移除了 Nashorn JavaScript 引擎。
總結
Java 15 雖然是短期版本,但特性相當豐富。文本塊在這一版終于塵埃落定,使多行字符串處理不再繁瑣。密封類的引入讓 Java 的類型系統更加強大,配合記錄類、模式匹配,Java 正朝著模式匹配和代數數據類型的方向邁進。
Java 16 新特性
發行時間:2021 年 3 月
語言特性
-
Records(記錄類)正式發布:
- Java 16 將記錄類從預覽轉為正式特性。
public record Point(int x, int y) { }
-
模式匹配的 instanceof 正式發布:
- Java 16 將前幾版預覽的 instanceof 模式匹配特性定型發布。
-
密封類第二次預覽:
- Java 16 再次提供了 sealed classes 的預覽。
核心庫增強
-
Vector API(孵化):
- Java 16 引入了一個全新的孵化模塊 —— 向量 API。
-
Foreign Memory Access API(孵化):
- Java 16 提供了外部內存訪問 API 的第三次孵化。
JDK 內部 API 強封裝
- Java 16 開啟了對內部 API 強封裝的最后一步。
總結
Java 16 是一個重要的過渡版本。它完成了若干預覽特性的正化(Records, 模式匹配)和 JDK 內部重構,使 Java 語言和平臺更加現代安全。
Java 17 新特性
發行時間:2021 年 9 月 14 日 (LTS長期支持版)
語言特性
-
密封類(正式):
- Sealed Classes 在 Java 17 正式成為語言特性。
-
Switch 模式匹配(預覽):
- Java 17 提供了 switch 的模式匹配作為預覽特性。
核心庫增強
-
偽隨機數生成器:
- Java 17 通過 JEP 356 引入了一系列新的隨機數生成器接口和實現。
-
跨平臺渲染管線:
- 針對 macOS 平臺,JEP 382 引入了基于 Metal 的 Java 2D 渲染管線。
-
棄用安全管理器:
- Java 17 將安全管理器標記為棄用。
性能與內部
- 永久性強封裝 JDK 內部:
- Java 17 完成了內部 API 封裝的最后工作。
總結
Java 17 是繼 Java 11 之后的又一個長期支持版本,也是“現代 Java”功能集的大成者。密封類、Record、Pattern Matching 這些 Java 近年推出的語法糖在此全部穩固下來。
Java 18 新特性
發行時間:2022 年 3 月
平臺與性能
-
默認字符集 UTF-8:
- Java 18 通過 JEP 400 將默認字符集統一為 UTF-8。
-
簡單的 Web 服務器:
- JDK 18 內置了一個簡單的純 Java 實現 HTTP 文件服務器。
核心類重構
- MethodHandle 實現:
- JEP 416 用 Method Handle 重寫了 Java 核心反射的部分實現。
新特性和 API
-
代碼段(Snippet)標簽 for JavaDoc:
- JEP 413 為 JavaDoc 文檔引入了
<pre><code>
風格的代碼片段注釋。
- JEP 413 為 JavaDoc 文檔引入了
-
Vector API 第三次孵化:
- Java 18 中 Vector API 進入第 3 輪孵化。
-
互聯網地址解析 SPI:
- JEP 418 引入了一個可插拔的名稱解析服務接口。
-
外部函數 & 內存 API 第二次孵化:
- Java 18 提供了 Panama 項目 Foreign Function & Memory API 的第二版孵化。
-
Switch 模式匹配第二次預覽:
- Java 18 的 JEP 420 給出了 switch 模式匹配的第二次預覽。
-
棄用終結器 Finalization:
- Java 18 通過 JEP 421 正式將終結器標記為廢棄。
安全與密碼
- 默認禁止弱算法:
- Java 18 在安全方面也做了一些更新。
總結
Java 18 新特性相對較少,最大的變化對普通開發者來說莫過于默認編碼 UTF-8 和內置簡易 Web 服務器。Java 18 繼續推進 Panama 和 Vector 等,使 Java 在系統編程和高性能計算上更具競爭力。
Java 19 新特性
發行時間:2022 年 9 月
并發與虛擬線程
-
虛擬線程(預覽):
- Java 19 帶來了備受期待的虛擬線程(Virtual Threads)預覽(JEP 425)。
-
結構化并發(孵化):
- Java 19 還孵化了結構化并發 API(Structured Concurrency,JEP 428)。
語言和模式匹配
-
記錄模式(預覽):
- Java 19 引入 Record Patterns 預覽(JEP 405)。
-
Switch 模式匹配第三次預覽:
- Java 19 的 switch 模式匹配(JEP 427)進入第 3 輪預覽。
外部接口和內存
- 外部函數 & 內存 API(預覽):
- Java 19 終于進入預覽階段(JEP 424)。
其他改進
-
虛擬線程 Pinning 問題優化:
- Java 19 虛擬線程預覽中已經實現了當虛擬線程在 synchronized 塊中等待時,不會阻塞底層 OS 線程。
-
Linux/RISC-V 移植:
- JEP 422 將 OpenJDK 移植到了 Linux/RISC-V 架構上。
總結
Java 19 是一個亮點頗多的版本。虛擬線程的初次亮相標志著 Java 并發模型迎來巨大變革;結構化并發、記錄模式等則完善了并發和模式匹配的語法。
Java 20 新特性
發行時間:2023 年 3 月
項目 Loom 持續改進
-
虛擬線程第二次預覽:
- Java 20 再次提供虛擬線程預覽(JEP 436)。
-
結構化并發第二次孵化:
- Java 20 將結構化并發 API (StructuredTaskScope 等) 進行第二輪孵化(JEP 437)。
-
作用域值(孵化):
- Java 20 引入了 Scoped Values(作用域值)孵化特性(JEP 429)。
模式匹配和類型系統
-
記錄模式第二次預覽:
- Java 20 延續了 Java 19 的記錄模式預覽(JEP 432)。
-
Switch 模式匹配第四次預覽:
- Java 20 的 switch 模式匹配(JEP 433)進入第 4 次預覽。
外部接口
- 外部函數 & 內存 API 第二次預覽:
- Java 20 將 Java 19 的外部函數/內存 API (Panama) 進行第二次預覽(JEP 434)。
總結
Java 20 在功能上和 Java 19 一脈相承,并無全新重量級特性亮相,但卻將之前的創新推進到了最后階段。
Java 21 新特性
發行時間:2023 年 9 月 19 日 (LTS長期支持版)
語言特性
-
字符串模板(預覽):
- Java 21 引入了字符串模板(String Templates)預覽(JEP 430)。
-
記錄模式 & 模式匹配 for switch(正式):
- Record Patterns 和 Pattern Matching for switch 在經歷多次預覽后,終于在 Java 21 正式發布(JEP 440, 441)。
-
未命名模式和變量(正式):
- Java 21 正式引入了未命名模式() 和未命名變量()(JEP 443)。
-
未命名類和實例 main 方法(預覽):
- Java 21 提供了一個有趣的預覽特性 JEP 445。
并發和虛擬線程
-
虛擬線程正式發布:
- Java 21 通過 JEP 444 將虛擬線程 (Virtual Threads) 定稿發布。
-
Sequenced Collections(序列集合):
- Java 21 引入了新的集合接口族 Sequenced 集合(JEP 431)。
JVM 和性能
-
分代 ZGC(實驗):
- Java 21 將 ZGC 升級為分代式垃圾收集器(Generational ZGC,JEP 439)。
-
禁用安全管理器:
- Java 21 完全禁止在啟動時開啟安全管理器。
-
類加載和鏈接緩存(預覽):
- JEP 483 引入了提前加載和鏈接的機制。
總結
Java 21 是迄今功能最強大的 Java 版本之一。虛擬線程和結構化并發在并發編程領域給予 Java 巨大能量,模式匹配全面落地使 Java 具備了代數數據類型的便利。
Java 22 新特性
發行時間:2024 年 3 月
語言與語法
-
未命名模式和變量轉正:
- 前文提到的下劃線 _ 模式和未命名變量在 Java 22 順利成為正式特性。
-
外部函數和內存 API 正式發布:
- Java 22 通過 JEP 454 將 Foreign Function & Memory API 正式加入標準庫。
-
多文件源代碼程序啟動:
- Java 22 引入了多源文件一起運行的功能(JEP 458)。
-
構造函數中允許語句在 super() 之前(預覽):
- JEP 447 在 Java 22 作為預覽推出了構造方法前置語句功能。
核心庫與安全
-
類文件 API 第二次預覽:
- Java 22 繼續預覽類文件 API (JEP 456/466)。
-
流收集器 API(預覽):
- Java 22 引入了流處理的新機制預覽。
總結
Java 22 作為 Java 21 之后的過渡版本,主要工作是鞏固和過渡。大量 Java 21 預覽的特性在 Java 22 得到正式發布,使得 Java 語言和 API 更加完善。
Java 23 新特性
發行時間:2024 年 9 月
語言與語法
-
原始類型模式(預覽):
- Java 23 通過 JEP 455 引入了對原始類型的模式匹配預覽。
-
類文件 API 第二次預覽:
- Java 23 繼續預覽類文件 API (JEP 456/466)。
-
Markdown JavaDoc 正式:
- Java 23 將 JavaDoc 的 Markdown 支持正式化。
總結
Java 23 是在 LTS (21) 之后,下一次 LTS (25) 之前的第二個常規版本。其主要作用是鞏固新功能并繼續探索。
Java 24 新特性
發行時間:2025 年 3 月
安全與密碼學
-
密鑰派生函數 API(預覽):
- Java 24 引入了 KDF (Key Derivation Function) API 預覽(JEP 478)。
-
完全禁用 Security Manager:
- Java 24 完全移除了安全管理器的啟用可能。
性能與工具
-
類加載與鏈接緩存:
- Java 24 通過 JEP 483 引入了類預加載和鏈接特性。
-
類文件 API 正式發布:
- Java 24 正式推出了類文件 API(JEP 484)。
-
Stream::gather 正式發布:
- Java 24 通過 JEP 485 增強了 Stream API,引入了 Stream.gather(Gatherer) 方法及 Gatherer 接口。
并發與內部改進
-
作用域值第四次預覽:
- ScopedValue 在 Java 24 進入第 4 次預覽(JEP 487)。
-
虛擬線程同步無 Pinning:
- Java 24 的虛擬線程在鎖中阻塞時會掛起自己,讓出載體線程。
總結
Java 24 作為非 LTS 版本,卻引入了史無前例多的新特性。它將過去幾年的預覽幾乎全部定型,并推出了像 KDF API、Scope Values 等值得期待的新預覽。