??????歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內(nèi)容和知識,也可以暢所欲言、分享您的想法和見解。
- 推薦:kuan 的首頁,持續(xù)學(xué)習(xí),不斷總結(jié),共同進步,活到老學(xué)到老
- 導(dǎo)航
- 檀越劍指大廠系列:全面總結(jié) java 核心技術(shù)點,如集合,jvm,并發(fā)編程 redis,kafka,Spring,微服務(wù),Netty 等
- 常用開發(fā)工具系列:羅列常用的開發(fā)工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
- 數(shù)據(jù)庫系列:詳細總結(jié)了常用數(shù)據(jù)庫 mysql 技術(shù)點,以及工作中遇到的 mysql 問題等
- 懶人運維系列:總結(jié)好用的命令,解放雙手不香嗎?能用一個命令完成絕不用兩個操作
- 數(shù)據(jù)結(jié)構(gòu)與算法系列:總結(jié)數(shù)據(jù)結(jié)構(gòu)和算法,不同類型針對性訓(xùn)練,提升編程思維,劍指大廠
非常期待和您一起在這個小小的網(wǎng)絡(luò)世界里共同探索、學(xué)習(xí)和成長。?????? ?? 歡迎訂閱本專欄 ??
1.介紹
JDK 21 已經(jīng)于 2023 年 9 月 19 日正式發(fā)布。本文總結(jié)了 JDK 21 發(fā)布的新特性。
根據(jù)發(fā)布的規(guī)劃,這次發(fā)布的 JDK 21 將是一個長期支持版(LTS 版)。LTS 版每 2 年發(fā)布一個,上一次長期支持版是 21 年 9 月發(fā)布的 JDK 17。不能抱有你強任你強,我用 java8 的思想。
2.版本
主要分為 OpenJDK 版本和 Oracle 版本,下載地址如下:
- OpenJDK 版本:https://jdk.java.net/21/
- Oracle 版本:https://www.oracle.com/java/technologies/downloads/
3.JDK21 新特性
- 序列集合
- 分代 ZGC
- 記錄模式
- switch 模式匹配
- 虛擬線程
- 棄用 Windows 32 位 x86 移植
- 不允許動態(tài)加載代理
- 密鑰封裝機制
4.安裝 jdk21
5.虛擬線程
將虛擬線程(Virtual Threads)引入 Java 平臺。虛擬線程是輕量級線程,可以顯著減少編寫、維護和觀察高吞吐量并發(fā)應(yīng)用程序的工作量。
- 輕量級線程管理:虛擬線程不需要底層操作系統(tǒng)線程的支持,因此可以創(chuàng)建數(shù)千甚至數(shù)萬個虛擬線程而不會消耗大量的內(nèi)存和資源。這使得應(yīng)用程序可以更高效地管理大量并發(fā)任務(wù)。
- 更快的線程創(chuàng)建和銷毀:傳統(tǒng)的 Java 線程創(chuàng)建和銷毀通常涉及昂貴的操作系統(tǒng)調(diào)用,而虛擬線程的創(chuàng)建和銷毀成本更低,因此可以更快速地啟動和停止線程。
- 更好的資源利用:由于虛擬線程可以更輕松地伸縮,因此它們有助于更好地利用現(xiàn)有的系統(tǒng)資源,以處理大規(guī)模的并發(fā)請求。
- 避免死鎖和資源爭奪:虛擬線程的管理方式可以減少線程之間的競爭和資源爭奪,從而降低了死鎖和性能問題的風(fēng)險。
- 簡化并發(fā)編程:虛擬線程的引入使得編寫并發(fā)程序變得更加容易,開發(fā)人員可以專注于業(yè)務(wù)邏輯而不必過多關(guān)注線程管理和同步。
public class Test01 {
public static void main(String[] args) {
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
IntStream.range(0, 10000).forEach(i -> executor.submit(() -> {
Thread.sleep(Duration.ofSeconds(1));
return i;
}));
}
}
}
6.有序集合
在 JDK 21 中,Sequenced Collections 的引入帶來了新的接口和方法來簡化集合處理。此增強功能旨在解決訪問 Java 中各種集合類型的第一個和最后一個元素需要非統(tǒng)一且麻煩處理場景。
Sequenced Collections 引入了三個新接口:
- SequencedCollection
- SequencedMap
- SequencedSet
綠色方框是新增的 3 個接口,從中可以看到已有集合類的繼承關(guān)系的變化:
-
List 繼承自 SequencedCollection。
-
Deque 繼承自 SequencedCollection。
-
LinkedHashSet 實現(xiàn)了 SequencedSet 接口。
-
SortedSet 繼承自 SequencedSet。
-
LinkedHashMap 實現(xiàn)了 SequencedMap 接口。
-
SortedMap 繼承自 SequencedMap。
有了這 3 個新的順序集合相關(guān)的接口之后,Java 代碼可以更清楚地表達順序集合以及順序集合上的操作。
這些接口附帶了一些新方法,以提供改進的集合訪問和操作功能。
/**
* 序列集合
*
* @author : qinyingjie
* @version : 2.2.0
* @date : 2023/9/26 01:37
*/
public class Test02 {
public static void main(String[] args) {
SequencedCollection<Integer> arr = new ArrayList<>();
arr.addLast(1);
arr.addLast(2);
arr.addLast(3);
arr.addLast(31);
arr.addFirst(14);
System.out.println(arr);
}
}
第一個和最后一個元素的訪問:
在 JDK 21 之前,檢索 Java 中集合的第一個和最后一個元素涉及不同的方法和途徑,具體取決于集合類型。
下面讓我們看一下使用 JDK 21 之前的 JDK API 調(diào)用訪問第一個和最后一個元素的一些示例:
訪問位置 | List | Deque | SortedSet |
---|---|---|---|
第一個元素 | list.get(0) | deque.getFirst() | set.first() |
最后一個元素 | list.get(list.size()-1) | deque.getLast() | set.last() |
可以看到,一個簡單的操作,在不同的集合中需要不同的編寫方式,非常麻煩!
但在 JDK 21 之后,訪問第一個和最后一個元素就方法多了:
對于List
, Deque
, Set
這些有序的集合,訪問方法變得統(tǒng)一起來:
- 第一個元素:
collection.getFirst()
- 最后一個元素:
collection.getLast()
首先是 SequencedCollection
,該接口的聲明如下所示:SequencedCollection
繼承自 Collection
。
interface SequencedCollection<E> extends Collection<E> {
SequencedCollection<E> reversed();
void addFirst(E);
void addLast(E);
E getFirst();
E getLast();
E removeFirst();
E removeLast();
}
在包含的方法中:
-
reversed 方法返回一個逆序的 SequencedCollection 對象。
-
addFirst 和 addLast 方法分別在集合的起始和結(jié)束位置添加新的元素。
-
getFirst 和 getLast 方法分別獲取集合的第一個和最后一個元素。
-
removeFirst 和 removeLast 方法分別刪除集合的第一個和最后一個元素。
SequencedSet
interface SequencedSet<E> extends Set<E>, SequencedCollection<E> {
SequencedSet<E> reversed();
}
SequencedMap
SequencedMap
繼承自 Map
,其中的 entry 有確定的出現(xiàn)順序。
SequencedMap
中的方法比較多,如下所示:
interface SequencedMap<K,V> extends Map<K,V> {
SequencedMap<K,V> reversed();
SequencedSet<K> sequencedKeySet();
SequencedCollection<V> sequencedValues();
SequencedSet<Entry<K,V>> sequencedEntrySet();
V putFirst(K, V);
V putLast(K, V);
Entry<K, V> firstEntry();
Entry<K, V> lastEntry();
Entry<K, V> pollFirstEntry();
Entry<K, V> pollLastEntry();
}
具體的方法說明:
-
reversed 方法返回一個 entry 逆序的 SequencedMap。
-
sequencedKeySet 方法返回包含 key 的 SequencedSet。
-
sequencedValues 方法返回包含 value 的 SequencedCollection。
-
sequencedEntrySet 方法返回包含 entry 的 SequencedSet。
-
putFirst 和 putLast 分別在 entry 的最前和最后位置插入名值對。
-
firstEntry 和 lastEntry 分別獲取第一個和最后一個 entry。
-
pollFirstEntry 和 pollLastEntry 分別刪除第一個和最后一個 entry。
7.記錄模式
使用記錄模式(Record Patterns)增強 Java 編程語言,以解構(gòu)記錄值??梢郧短子涗浤J胶皖愋湍J?,以實現(xiàn)功能強大、聲明性和可組合形式的數(shù)據(jù)導(dǎo)航和處理。
/**
* 記錄類
*
* @author : qinyingjie
* @date : 2023/9/26
*/
public record Test03(int x, int y) {
}
static void print(Object o) {
if (o instanceof Test03(int x, int y)) {
System.out.println(x + y);
}
}
8.switch 模式匹配
通過 switch 表達式和語句的模式匹配來增強 Java 編程語言。通過將模式匹配擴展到 switch,可以針對多個模式測試表達式,每個模式都有一個特定的操作,從而可以簡潔、安全地表達復(fù)雜的面向數(shù)據(jù)的查詢。
/**
* switch模式匹配
*
* @author : qinyingjie
* @version : 2.2.0
* @date : 2023/9/26 01:37
*/
public class Test04 {
public static void main(String[] args) {
Object obj = "你好";
Object a = switch (obj) {
case Integer i -> String.format("int %d", i);
case String s -> String.format("string %s", s);
case Double d -> String.format("Double %s", d);
default -> obj.toString();
};
System.out.println(a);
}
}
覺得有用的話點個贊
????
唄。
??????本人水平有限,如有紕漏,歡迎各位大佬評論批評指正!????????????如果覺得這篇文對你有幫助的話,也請給個點贊、收藏下吧,非常感謝!?? ?? ??
??????Stay Hungry Stay Foolish 道阻且長,行則將至,讓我們一起加油吧!??????文章來源:http://www.zghlxwxcb.cn/news/detail-762974.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-762974.html
到了這里,關(guān)于【Java基礎(chǔ)系列】JDK21新特性的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!