自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java Map的演進(jìn)歷史:從JDK 1.7到JDK 21

開發(fā) 后端
本文給大家介紹了關(guān)于 Java 中 Map 接口在 JDK1.7 到 JDk21 中演進(jìn)以及新增方法。

Java 中的Map接口是集合框架中一個(gè)非常重要的組成部分,它用于存儲(chǔ)鍵值對。從 JDK 1.7 到最新的長期支持版本 JDK 21,Map接口經(jīng)歷了一系列的演變和發(fā)展,引入了許多新的方法和改進(jìn)了已有功能,以更好地滿足開發(fā)者的需要。下面我們將詳細(xì)介紹這些變化。

JDK 1.7 中的 Map 接口

在 JDK 1.7 時(shí)期,Map接口已經(jīng)相當(dāng)成熟,提供了一套基礎(chǔ)但強(qiáng)大的 API 來操作鍵值對數(shù)據(jù)結(jié)構(gòu)。此時(shí)的Map接口主要包含了如下一些常用的方法:

  • put(K key, V value): 向Map中添加鍵值對。
  • get(Object key): 根據(jù)給定的鍵獲取對應(yīng)的值。
  • remove(Object key): 移除指定鍵及其關(guān)聯(lián)的值。
  • containsKey(Object key): 判斷此Map是否包含指定鍵。
  • containsValue(Object value): 判斷此Map是否包含指定值。
  • size(): 返回Map中的鍵值對數(shù)量。
  • isEmpty(): 測試Map是否為空。
  • keySet()、values()、entrySet() 分別返回所有鍵、所有值以及所有鍵值對的集合視圖。

此外,JDK 1.7 還特別為并發(fā)場景下的Map實(shí)現(xiàn)(即ConcurrentHashMap)做了一些優(yōu)化,比如使用分段鎖來提高多線程環(huán)境下的性能。

JDK 8 對 Map 得增強(qiáng)

到了 JDK 8,Map接口迎來了幾個(gè)顯著的變化。

(1) 新增方法

// 1. 獲取指定鍵對應(yīng)的值,如果鍵不存在,則返回一個(gè)默認(rèn)值。
V getOrDefault(Object key, V defaultValue)
// 2. 使用函數(shù)接口遍歷 Map中得鍵值對。
void forEach(BiConsumer<? super K, ? super V> action)
// 3. 使用函數(shù)接口替換 Map中得鍵值對。
void replaceAll(BiFunction<? super K, ? super V, ? extends V> function)
// 4. 只有在給定的鍵尚未與值關(guān)聯(lián)時(shí)(或者關(guān)聯(lián)值未 null),才會(huì)將指定的鍵值對插入到此Map中。
V putIfAbsent(K key, V value)
// 5. 用于根據(jù)給定的鍵(key)以及一個(gè)能根據(jù)鍵和當(dāng)前值生成新值的函數(shù)(rf),
// 來對 Map 中的鍵值對進(jìn)行動(dòng)態(tài)計(jì)算和更新操作。
V compute(K key, BiFunction<? super K, ? super V, ? extends V> rf)
// 6. 只有在給定的鍵尚未與值關(guān)聯(lián)時(shí)(或者關(guān)聯(lián)值未 null),才會(huì)將指定的鍵值對插入到此Map中,
// 注意如果 mf 函數(shù)返回 null 則不會(huì)插入。
V computeIfAbsent(K key, Function<? super K, ? extends V> mf)
// 7. 用于在 Map 中處理鍵值對的合并操作,根據(jù)指定的鍵(key)、一個(gè)默認(rèn)值(value)
// 以及一個(gè)用于合并計(jì)算的函數(shù)(rf)來決定如何更新或添加鍵值對。
V merge(K key, V value, BiFunction<? super K, ? super V, ? extends V> rf)
// 8. 下方兩個(gè)方法是 Map.Entry中新增得兩個(gè)靜態(tài)方法,分別用于對Map的Entry集合進(jìn)行排序操作,
// 排序得依據(jù)分別是 key 得自然序或者 value 得自然序。當(dāng)然這兩個(gè)方法也支持傳入自定義排序函數(shù)。
static <K extends Comparable<? super K>, V> Comparator<Map.Entry<K, V>> comparingByKey()
static <K, V> Comparator<Map.Entry<K, V>> comparingByValue(Comparator<? super V> cmp)
// 9. 僅當(dāng)指定的鍵當(dāng)前映射到指定的值時(shí),才刪除該鍵值對。
boolean remove(Object key, Object value)
// 10. 將指定鍵(key)在Map中所關(guān)聯(lián)的值替換為新給定的值(value)。
V replace(K key, V value)
// 11. 用于在Map中替換與指定鍵(key)相關(guān)聯(lián)的值。但替換操作是有條件的,
// 只有當(dāng)傳入 key 得映射值 與傳入的要被替換的舊值 oldValue 參數(shù)完全匹配時(shí),
// 才會(huì)將該鍵對應(yīng)的的值替換為新的值 newValue。
V replace(K key, V oldValue, V newValue)
// 12. 對 Map 中的每一個(gè)鍵值對,根據(jù)給定的一個(gè)二元函數(shù)(function)來更新鍵值對的值部分。
V replaceAll(BiFunction<? super K, ? super V, ? extends V> function)

(2) 并發(fā)優(yōu)化

對于 Map 接口得并發(fā)實(shí)現(xiàn)類ConcurrentHashMap,JDK 1.8 對 ConcurrentHashMap 進(jìn)行了重大修改,采用了 CAS(Compare - And - Swap)操作和 Synchronized 關(guān)鍵字來實(shí)現(xiàn)更細(xì)粒度的并發(fā)控制,摒棄了原來的分段鎖機(jī)制并且修改了歷程數(shù)據(jù)結(jié)構(gòu),可以實(shí)現(xiàn)更高效得讀寫操作。性能方面,當(dāng)數(shù)據(jù)量較大且hash沖突比較嚴(yán)重時(shí),查詢效率也得到了顯著提升。

JDK 9 至 JDK 21 中 Map 的發(fā)展

從 JDK 9 開始直到最新的 JDK 21,雖然沒有像 JDK 8 那樣大規(guī)模地?cái)U(kuò)展Map接口的功能,但是仍然有一些細(xì)微但實(shí)用的內(nèi)部優(yōu)化被引入進(jìn)來。

(1) JDK 9 更新

JDK 9 為 Map 接口提供了一系列的靜態(tài)工廠方法,如 of() 方法。這些方法可以更方便地創(chuàng)建不可變的 Map 實(shí)例

// 不可變Map創(chuàng)建
static <K,V> Map<K,V> of()
static <K,V> Map<K,V> of(K k1, V v1)
static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2)
// ... 最多支持10個(gè)鍵值對

// 超過10個(gè)鍵值對使用
static <K,V> Map<K,V> ofEntries(Map.Entry<? extends K,? extends V>... entries)

這種方式創(chuàng)建的Map是不可變的,任何嘗試修改它的操作都會(huì)拋出 UnsupportedOperationException。它在需要?jiǎng)?chuàng)建固定內(nèi)容的Map時(shí)非常有用,比如配置信息、常量Map等場景

(2) JDK 10 - JDK 21 的改動(dòng)和新增方法(相對穩(wěn)定階段)

在這期間Map接口本身沒有太多大規(guī)模的改動(dòng),但 Java 整體的性能優(yōu)化和內(nèi)部實(shí)現(xiàn)的調(diào)整可能會(huì)間接地影響Map的性能。例如 JDK 在垃圾回收機(jī)制、內(nèi)存管理等方面的改進(jìn)都會(huì)對存儲(chǔ)在中的對象的生命周期和內(nèi)存占用產(chǎn)生積極的影響。

JDK 10 新增了一個(gè) copyOf() 方法,用于創(chuàng)建一個(gè)現(xiàn)有Map的不可變副本。

// 創(chuàng)建不可變副本
static <K,V> Map<K,V> copyOf(Map<? extends K,? extends V> map)

其他三方庫

雖然 Map 接口在 JDK 10 之后再無大的變動(dòng),但是還有很多其他三方庫實(shí)現(xiàn)了對 Map 得增強(qiáng)。

1.Google 的 Guava 庫

(1) 創(chuàng)建方式的增強(qiáng)

多種類型 Map 創(chuàng)建和靈活的不可變 Map 創(chuàng)建,Maps.newHashMap()來創(chuàng)建類似java.util.HashMap的普通可變Map,如Maps.immutableMap()用來創(chuàng)建不可變Map。

(2) 強(qiáng)大的轉(zhuǎn)換操作(鍵值對轉(zhuǎn)換)、過濾操作(按鍵或值過濾)

Maps.transformEntries():該方法允許根據(jù)一個(gè)自定義的函數(shù)來轉(zhuǎn)換Map中的每個(gè)鍵值對、Maps.filterKeys()和Maps.filterValues():這兩個(gè)方法分別用于對Map的鍵和值進(jìn)行過濾。

(3) 引入了能處理一對多關(guān)系的 Multimap(多值)

Guava 的Multimap是一種特殊的Map,它允許一個(gè)鍵對應(yīng)多個(gè)值,解決了傳統(tǒng)Map在處理一對多關(guān)系時(shí)的不便。這在很多實(shí)際場景中非常有用,比如一個(gè)學(xué)生可以選多門課程,一本書可以有多個(gè)作者等。

(4) 比較兩個(gè) Map 之間得差異

Maps.difference()方法用于比較兩個(gè)Map之間的差異。它返回一個(gè)MapDifference對象,這個(gè)對象包含了豐富的信息,如只在左邊Map出現(xiàn)的鍵值對、只在右邊Map出現(xiàn)的鍵值對、在兩個(gè)Map中都出現(xiàn)但值不同的鍵值對以及在兩個(gè)Map中都出現(xiàn)且值相同的鍵值對等。這對于數(shù)據(jù)同步、版本比較等場景非常有幫助。

2.Apache 的 Commons Collections庫

(1) 雙向映射(BidiMap)

Commons Collections 中的 BidiMap 是一種特殊的 Map,它提供了雙向查找的功能。傳統(tǒng)的 Map 是通過鍵查找值,而 BidiMap 允許通過值反向查找鍵。這種雙向映射在很多場景下非常有用,例如在用戶認(rèn)證系統(tǒng)中,可能需要通過用戶 ID(鍵)查找用戶詳細(xì)信息(值),同時(shí)也需要通過用戶的某些唯一標(biāo)識(shí)(如用戶名)來獲取用戶 ID。

(2) 多值映射(MultiValueMap)

MultiValueMap 用于處理一個(gè)鍵對應(yīng)多個(gè)值的情況,類似于 Guava 中的 Multimap。它提供了方便的方法來添加、獲取和操作多值映射。這種數(shù)據(jù)結(jié)構(gòu)在處理具有一對多關(guān)系的數(shù)據(jù)時(shí)非常有用,比如在權(quán)限管理系統(tǒng)中,一個(gè)用戶角色(鍵)可能對應(yīng)多個(gè)權(quán)限(值)。

(3) 基于 Transformer 和 Closure 的操作

  • Transformer(轉(zhuǎn)換):可以用于將Map中的元素從一種形式轉(zhuǎn)換為另一種形式。它接受一個(gè)輸入對象,并返回轉(zhuǎn)換后的對象。通過Transformer,可以對Map中的值進(jìn)行各種數(shù)學(xué)運(yùn)算、格式化等操作。例如,將Map中的所有整數(shù)值乘以一個(gè)固定的系數(shù)。
  • Closure(閉包):用于對Map中的元素執(zhí)行某種操作,如更新值等。它可以在不返回新對象的情況下直接修改Map中的元素,這在需要批量修改Map元素的場景下非常有用,比如將Map中所有字符串值轉(zhuǎn)換為大寫形式。

3.Eclipse 的Collections庫

其實(shí) Eclipse 基金會(huì)也創(chuàng)建一個(gè)開源的 Java 集合框架庫叫 eclipse-collections。它具有優(yōu)化的數(shù)據(jù)結(jié)構(gòu)和豐富、實(shí)用且流暢的 API。

只是目前使用使用的人比較少,這里給大家簡單介紹一下功能,有興趣可以自行去 github 閱讀官方說明。

github 地址:https://github.com/eclipse/eclipse-collections

  • 對 Map 的主要增強(qiáng)如下:
  • 創(chuàng)建和初始化可變與不可變 Map。
  • 操作鏈支持增強(qiáng): MutableMap 支持操作鏈,它可以在一個(gè)表達(dá)式中連續(xù)進(jìn)行多個(gè)操作,如添加、刪除和更新鍵值對。例如MutableMap<String, Integer> mutableMap = Maps.mutable.of("key1", 1, "key2", 2).put("key3", 3);
  • 分組功能增強(qiáng): 提供了強(qiáng)大的 GroupBy 操作,可以根據(jù)指定的規(guī)則對 Map 中的元素進(jìn)行分組
  • 視圖和迭代增強(qiáng): 可以創(chuàng)建只讀視圖。
  • 與其他集合類型協(xié)同操作增強(qiáng): 對于 Map 來說,它可以方便裝換成其他集合(如 List、Set 等)。

總結(jié)

本文給大家介紹了關(guān)于 Java 中 Map 接口在 JDK1.7 到 JDk21 中演進(jìn)以及新增方法,還介紹了一些 Guava、Commons Collections、Eclipse Collections 對 Map 的增強(qiáng),希望大家喜歡。

責(zé)任編輯:趙寧寧 來源: 程序員wayn
相關(guān)推薦

2024-04-08 07:27:02

JDK8ZGC垃圾回收

2009-01-03 08:55:04

Java2008NetBeans

2023-09-21 08:16:56

JDK 21向量計(jì)算計(jì)算

2023-10-20 08:12:00

JDK21線程池配置

2009-07-07 10:54:01

JDK

2022-06-02 08:37:10

架構(gòu)DDDMVC

2009-02-01 10:10:00

Java資格認(rèn)證JDK1.4JDK1.6

2015-04-07 11:05:15

VMwareOpenStack

2009-07-09 10:05:55

2022-11-30 09:07:09

JDK源碼數(shù)組

2009-07-07 15:41:56

myeclipse配置Tomcat安裝tomcat插件

2022-07-01 08:26:22

區(qū)塊鏈去中心化以太坊

2023-08-28 16:10:00

容器化DockerKubernetes

2022-09-01 08:01:59

零信任TNA網(wǎng)絡(luò)

2017-10-30 09:09:41

2019-04-24 09:43:46

代碼開發(fā)工具

2023-10-10 22:24:16

2024-06-06 16:15:00

2009-07-07 12:48:29

JDK環(huán)境變量設(shè)置

2009-07-08 14:38:27

JDK 1.1J2SE歷史
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)