當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Java ConcurrentMap用法及代碼示例


ConcurrentMap是一個接口並且它是一個成員Java集合框架,在 JDK 1.5 中引入,代表一個 Map,能夠處理對其的並發訪問,而不影響 Map 中條目的一致性。 ConcurrentMap 接口存在於java.util.concurrent包。除了從 SuperInterface 繼承的方法之外,它還提供了一些額外的方法,即Map。它繼承了嵌套接口Map.Entry

HashMap操作不同步,而哈希表提供同步。雖然Hashtable是線程安全的,但它的效率不是很高。為了解決這個問題,Java Collections Framework 引入了ConcurrentMap在Java 1.5中。

ConcurrentMap的層次結構

ConcurrentMap Interface in java

聲明:

public interface ConcurrentMap<K,V> extends Map<K,V>

這裏,K是鍵Object的類型,V是值Object的類型。

實現類

由於它屬於java.util.concurrent包,我們必須導入正在使用

import java.util.concurrent.ConcurrentMap
                or
import java.util.concurrent.*

ConcurrentMap 有兩個實現類,它們是ConcurrentSkipListMapConcurrentHashMap。 ConcurrentSkipListMap 是一個可擴展的實現ConcurrentNavigableMap擴展ConcurrentMap接口的接口。 ConcurrentSkipListMap 中的鍵按自然順序排序或在構造對象時使用比較器排序。 ConcurrentSkipListMap 的預期時間成本為日誌(n)用於插入、刪除和搜索操作。它是一個線程安全的類,因此,所有基本操作都可以並發完成。

用法:

// ConcurrentMap implementation by ConcurrentHashMap
CocurrentMap<K, V> numbers = new ConcurrentHashMap<K, V>();

// ConcurrentMap implementation by ConcurrentSkipListMap
ConcurrentMap< ? , ? > objectName = new ConcurrentSkipListMap< ? , ? >();

例子:

Java


// Java Program to illustrate methods 
// of ConcurrentMap interface 
import java.util.concurrent.*; 
  
class ConcurrentMapDemo { 
  
    public static void main(String[] args) 
    { 
        // Since ConcurrentMap is an interface, 
        // we create instance using ConcurrentHashMap 
        ConcurrentMap<Integer, String> m = new ConcurrentHashMap<Integer, String>(); 
        m.put(100, "Geeks"); 
        m.put(101, "For"); 
        m.put(102, "Geeks"); 
  
        // Here we cant add Hello because 101 key 
        // is already present 
        m.putIfAbsent(101, "Hello"); 
  
        // We can remove entry because 101 key 
        // is associated with For value 
        m.remove(101, "For"); 
  
        // Now we can add Hello 
        m.putIfAbsent(101, "Hello"); 
  
        // We can replace Hello with For 
        m.replace(101, "Hello", "For"); 
        System.out.println("Map contents : " + m); 
    } 
}
輸出
Map contents : {100=Geeks, 101=For, 102=Geeks}


Basic Methods

1. 添加元素

ConcurrentSkipListMap 的 put() 方法是 Java 中的內置函數,它將指定值與此映射中的指定鍵相關聯。如果映射之前包含鍵的映射,則舊值將被替換。

Java


// Java Program to demonstrate adding 
// elements 
  
import java.util.concurrent.*; 
  
class AddingElementsExample { 
    public static void main(String[] args) 
    { 
        // Instantiate an object 
        // Since ConcurrentMap 
        // is an interface so We use 
        // ConcurrentSkipListMap 
        ConcurrentMap<Integer, Integer> mpp = new ConcurrentSkipListMap<Integer, Integer>(); 
  
        // Adding elements to this map 
          // using put() method 
        for (int i = 1; i <= 5; i++) 
            mpp.put(i, i); 
  
        // Print map to the console 
        System.out.println("After put(): " + mpp); 
    } 
}
輸出
After put(): {1=1, 2=2, 3=3, 4=4, 5=5}

2. 刪除元素

ConcurrentSkipListMap 的 remove() 方法是 Java 中的內置函數,用於從此映射中刪除指定鍵的映射。如果該特定鍵沒有映射,則該方法返回 null。執行此方法後,Map的大小會減小。

Java


// Java Program to demonstrate removing 
// elements 
  
import java.util.concurrent.*; 
  
class RemovingElementsExample { 
    public static void main(String[] args) 
    { 
        // Instantiate an object 
        // Since ConcurrentMap 
        // is an interface so We use 
        // ConcurrentSkipListMap 
        ConcurrentMap<Integer, Integer> mpp = new ConcurrentSkipListMap<Integer, Integer>(); 
  
        // Adding elements to this map 
        // using put method 
        for (int i = 1; i <= 5; i++) 
            mpp.put(i, i); 
  
        // remove() mapping associated 
        // with key 1 
        mpp.remove(1); 
  
        System.out.println("After remove(): " + mpp); 
    } 
}
輸出
After remove(): {2=2, 3=3, 4=4, 5=5}

3. 訪問元素

我們可以使用 get() 方法訪問 ConcurrentSkipListMap 的元素,下麵給出了示例。

Java


// Java Program to demonstrate accessing 
// elements 
  
import java.util.concurrent.*; 
  
class AccessingElementsExample { 
  
    public static void main(String[] args) 
    { 
  
        // Instantiate an object 
        // Since ConcurrentMap 
        // is an interface so We use 
        // ConcurrentSkipListMap 
        ConcurrentMap<Integer, String> chm = new ConcurrentSkipListMap<Integer, String>(); 
  
        // insert mappings using put method 
        chm.put(100, "Geeks"); 
        chm.put(101, "for"); 
        chm.put(102, "Geeks"); 
        chm.put(103, "Contribute"); 
  
        // Displaying the HashMap 
        System.out.println("The Mappings are: "); 
        System.out.println(chm); 
  
        // Display the value of 100 
        System.out.println("The Value associated to "
                           + "100 is : " + chm.get(100)); 
  
        // Getting the value of 103 
        System.out.println("The Value associated to "
                           + "103 is : " + chm.get(103)); 
    } 
}
輸出
The Mappings are: 
{100=Geeks, 101=for, 102=Geeks, 103=Contribute}
The Value associated to 100 is : Geeks
The Value associated to 103 is : Contribute

4. 遍曆

我們可以使用 Iterator 接口來遍曆 Collection Framework 的任何結構。由於迭代器使用一種類型的數據,因此我們使用 Entry< ? , ? > 將兩種不同的類型解析為兼容的格式。然後使用 next() 方法打印 ConcurrentSkipListMap 的元素。

Java


import java.util.concurrent.*; 
import java.util.*; 
  
public class TraversingExample { 
  
    public static void main(String[] args) 
    { 
  
        // Instantiate an object 
        // Since ConcurrentMap 
        // is an interface so We use 
        // ConcurrentSkipListMap 
        ConcurrentMap<Integer, String> chmap = new ConcurrentSkipListMap<Integer, String>(); 
  
        // Add elements using put() 
        chmap.put(8, "Third"); 
        chmap.put(6, "Second"); 
        chmap.put(3, "First"); 
        chmap.put(11, "Fourth"); 
  
        // Create an Iterator over the 
        // ConcurrentSkipListMap 
        Iterator<ConcurrentSkipListMap 
                     .Entry<Integer, String> > itr 
            = chmap.entrySet().iterator(); 
  
        // The hasNext() method is used to check if there is 
        // a next element The next() method is used to 
        // retrieve the next element 
        while (itr.hasNext()) { 
            ConcurrentSkipListMap 
                .Entry<Integer, String> entry 
                = itr.next(); 
            System.out.println("Key = " + entry.getKey() 
                               + ", Value = "
                               + entry.getValue()); 
        } 
    } 
}
輸出
Key = 3, Value = First
Key = 6, Value = Second
Key = 8, Value = Third
Key = 11, Value = Fourth

ConcurrentMap的方法

  • K- Map中按鍵的類型。
  • V- 映射中映射的值的類型。

METHOD

DESCRIPTION

計算(K key, BiFunction<? super K,? super

V,?擴展 V> 重映射函數)

嘗試計算指定鍵及其當前映射值的映射(如果沒有當前映射,則為 null)。
computeIfAbsent(K key, Function<? super K,? 擴展 V> 映射函數) 如果指定的鍵尚未與值關聯(或映射為 null),則嘗試使用給定的映射函數計算其值並將其輸入到此映射中,除非 null。
computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) 如果指定鍵的值存在且非空,則嘗試在給定鍵及其當前映射值的情況下計算新映射。
forEach(BiConsumer<?超級 K,?超級 V> 操作) 對此映射中的每個條目執行給定的操作,直到處理完所有條目或該操作引發異常。
getOrDefault(Object key, V defaultValue) 返回指定鍵映射到的值,如果此映射不包含該鍵的映射,則返回 defaultValue。
merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction) 如果指定的鍵尚未與值關聯或與 null 關聯,則將其與給定的非 null 值關聯。
putIfAbsent(K 鍵, V 值) 如果指定的鍵尚未與值關聯,則將其與給定值關聯。
刪除(對象鍵,對象值) 僅當當前映射到給定值時才刪除鍵的條目。
替換(K鍵,V值) 僅當當前映射到某個值時才替換鍵的條目。
替換(K 鍵,V 舊值,V 新值) 僅當當前映射到給定值時才替換鍵的條目。
ReplaceAll(BiFunction<? super K,? super V,? 擴展 V> 函數) 將每個條目的值替換為在該條目上調用給定函數的結果,直到處理完所有條目或函數引發異常。

從接口 java.util.Map 繼承的方法

METHOD

DESCRIPTION

Map clear() 從此映射中刪除所有映射(可選操作)。
Map containsKey() 如果此映射包含指定鍵的映射,則返回 true。
Map containsValue() 如果此映射將一個或多個鍵映射到指定值,則返回 true。
entry(K k, V v) 返回包含給定鍵和值的不可變 Map.Entry。
Map entrySet() 返回此映射中包含的映射的集合視圖。
Map equals() 比較指定對象與此映射是否相等。
Map get() 返回指定鍵映射到的值,如果此映射不包含該鍵的映射,則返回 null。
Map hashCode() 返回此映射的哈希代碼值。
Map isEmpty() 如果此映射不包含鍵值映射,則返回 true。
Map keySet() 返回此映射中包含的鍵的集合視圖。
of() 返回包含零映射的不可變映射。
of(K k1, V v1) 返回包含單個映射的不可變映射。
of(K k1, V v1, K k2, V v2) 返回包含兩個映射的不可變映射。
of(K k1, V v1, K k2, V v2, K k3, V v3) 返回包含三個映射的不可變映射。
of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4) 返回包含四個映射的不可變映射。
of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5) 返回包含五個映射的不可變映射。
of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6) 返回包含六個映射的不可變映射。
of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7) 返回包含七個映射的不可變映射。
of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8) 返回包含八個映射的不可變映射。
的 (K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9、V v9) 返回包含九個映射的不可變映射。
的 (K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9、V v9、K k10、V v10) 返回一個包含十個映射的不可變映射。
ofEntries(Map.Entry<? 擴展 K,? 擴展 V>... 條目) 返回一個不可變映射,其中包含從給定條目中提取的鍵和值。
Map put() 將指定值與此映射中的指定鍵相關聯(可選操作)。
Map putAll() 將指定映射中的所有映射複製到此映射(可選操作)。
Map remove() 從此映射中刪除鍵的映射(如果存在)(可選操作)。
size() 返回此映射中鍵值映射的數量。
values() 返回此映射中包含的值的集合視圖。

參考:https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/ConcurrentMap.html



相關用法


注:本文由純淨天空篩選整理自bishaldubey大神的英文原創作品 ConcurrentMap Interface in java。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。