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


Java ConcurrentSkipListMap用法及代碼示例


ConcurrentSkipListMap 類是的成員Java集合框架。它是在JDK 1.6中引入的,它屬於java.util.concurrent包。 ConcurrentSkipListMap 是一個可擴展的實現ConcurrentNavigableMap。所有元素都根據自然順序或按Comparator Interface在施工期間通過。這個類使用並發變體SkipList數據結構提供日誌(n)插入、刪除、更新和訪問操作的時間成本。這些操作對於多個線程並發執行是安全的。

聲明

public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V> implements ConcurrentNavigableMap<K,V>, Cloneable, Serializable

這裏,K 是鍵對象類型,V 是值對象類型。

ConcurrentSkipListMap的層次結構

ConcurrentSkipListMap-in-Java-with-Examples

它實現了可串行化,可克隆,ConcurrentMap,ConcurrentNavigableMap,Map,NavigableMap Interface,SortedMap Interface接口和擴展抽象映射<K, V>類。

ConcurrentSkipListMap 的構造函數

1. ConcurrentSkipListMap():構造一個新的空映射,根據鍵的自然順序排序。

ConcurrentSkipListMap<K, V> cslm = new ConcurrentSkipListMap<K, V>();

2. ConcurrentSkipListMap(Comparator<? super K> comparator):構造一個新的、空的映射,根據指定的比較器排序。

ConcurrentSkipListMap<K, V> cslm = new ConcurrentSkipListMap<K, V>(Comparator<? super K> comparator);

3. ConcurrentSkipListMap(Map<? extends K,? extends V> m):構造一個新映射,其中包含與給定映射相同的映射,並根據鍵的自然順序排序。

ConcurrentSkipListMap<K, V> cslm = new ConcurrentSkipListMap<K, V>(Map<? extends K,? extends V> m);

4. ConcurrentSkipListMap(SortedMap<K,? extends V> m):構造一個包含相同映射的新映射,並使用與指定排序映射相同的順序。

ConcurrentSkipListMap<K, V> cslm = new ConcurrentSkipListMap<K, V>(SortedMap<K,? extends V> m);

示例

Java


// Java Program to Demonstrate 
// ConcurrentSkipListMap 
  
import java.io.*; 
import java.util.*; 
import java.util.concurrent.*; 
  
class ConcurrentSkipListMapExample { 
    public static void main(String[] args) 
    { 
        // create an instance of ConcurrentSkipListMap 
        ConcurrentSkipListMap<String, String> cslm 
            = new ConcurrentSkipListMap<String, String>(); 
  
        // Add mappings using put method 
        cslm.put("3", "Geeks"); 
        cslm.put("2", "from"); 
        cslm.put("1", "Hi!"); 
        cslm.put("5", "Geeks"); 
        cslm.put("4", "for"); 
  
        // print to the console 
        System.out.println("Initial Map : " + cslm); 
  
        // print key-value pair whose key is greater than 2 
        System.out.println("ceilingEntry-2: "
                           + cslm.ceilingEntry("2")); 
  
        // get the descending key set 
        NavigableSet navigableSet = cslm.descendingKeySet(); 
  
        System.out.println("descendingKeySet: "); 
  
        // Iterate through the keySet 
        Iterator itr = navigableSet.iterator(); 
        while (itr.hasNext()) { 
            String s = (String)itr.next(); 
            System.out.println(s); 
        } 
  
        // print the first mapping 
        System.out.println("firstEntry: "
                           + cslm.firstEntry()); 
  
        // print the last mapping 
        System.out.println("lastEntry: "
                           + cslm.lastEntry()); 
  
        // remove the first mapping and print it 
        System.out.println("pollFirstEntry: "
                           + cslm.pollFirstEntry()); 
  
        // print the first mapping 
        System.out.println("now firstEntry: "
                           + cslm.firstEntry()); 
  
        // remove the last mapping and print it 
        System.out.println("pollLastEntry: "
                           + cslm.pollLastEntry()); 
  
        // print the last mapping 
        System.out.println("now lastEntry: "
                           + cslm.lastEntry()); 
    } 
}
輸出
Initial Map : {1=Hi!, 2=from, 3=Geeks, 4=for, 5=Geeks}
ceilingEntry-2: 2=from
descendingKeySet: 
5
4
3
2
1
firstEntry: 1=Hi!
lastEntry: 5=Geeks
pollFirstEntry: 1=Hi!
now firstEntry: 2=from
pollLastEntry: 5=Geeks
now lastEntry: 4=for

Basic Operations

1. 添加映射

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

Java


// Java Program to demonstrate adding 
// mappings to a ConcurrentSkipListMap 
  
import java.util.concurrent.*; 
  
class AddingMappingsExample { 
    public static void main(String[] args) 
    { 
  
        // Initializing the map 
        ConcurrentSkipListMap<Integer, Integer> cslm 
            = new ConcurrentSkipListMap<Integer, Integer>(); 
  
        // Adding elements to this map 
        for (int i = 1; i <= 9; i++) 
            cslm.put(i, i); 
  
        // put() operation on the map 
        System.out.println("After put(): " + cslm); 
    } 
}
輸出
After put(): {1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8, 9=9}

2. 刪除映射

ConcurrentSkipListMap remove()ConcurrentSkipListMap 的方法從此映射中刪除指定鍵的映射。如果該特定鍵沒有映射,則該方法返回 null。執行此方法後,Map的大小會減小。要刪除Map的第一個條目和最後一個條目,我們可以使用pollFirstEntry()pollLastEntry()分別。

Java


// Java Program Demonstrate removing 
// mappings from ConcurrentSkipListMap 
  
import java.util.concurrent.*; 
  
class RemovingMappingsExample { 
    public static void main(String[] args) 
    { 
  
        // Initializing the map 
        ConcurrentSkipListMap<Integer, Integer> cslm 
            = new ConcurrentSkipListMap<Integer, Integer>(); 
  
        // Adding elements to this map 
        for (int i = 1; i <= 6; i++) 
            cslm.put(i, i); 
  
        // remove() operation on the map 
        cslm.remove(5); 
  
        // print the modified map 
        System.out.println("After remove(): " + cslm); 
  
        // remove the first mapping and print it 
        System.out.println("pollFirstEntry: "
                           + cslm.pollFirstEntry()); 
  
        // remove the last mapping and print it 
        System.out.println("pollLastEntry: "
                           + cslm.pollLastEntry()); 
            
          // Print final map 
          System.out.println("map contents: " + cslm); 
    } 
}
輸出
After remove(): {1=1, 2=2, 3=3, 4=4, 6=6}
pollFirstEntry: 1=1
pollLastEntry: 6=6
map contents: {2=2, 3=3, 4=4}

3. 迭代

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

Java


// Java Program to demonstrate iterating 
// over ConcurrentSkipListMap 
  
import java.util.concurrent.*; 
import java.util.*; 
  
class IteratingExample { 
    public static void main(String[] args) 
    { 
        // create an instance of ConcurrentSkipListMap 
        ConcurrentSkipListMap<Integer, Integer> cslm 
            = new ConcurrentSkipListMap<>(); 
  
        // Add mappings using put method 
        for (int i = 0; i < 6; i++) { 
            cslm.put(i, i); 
        } 
  
        // Create an Iterator over the 
        // ConcurrentSkipListMap 
        Iterator<ConcurrentSkipListMap 
                     .Entry<Integer, Integer> > itr 
            = cslm.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, Integer> entry 
                = itr.next(); 
            System.out.println("Key = " + entry.getKey() 
                               + ", Value = "
                               + entry.getValue()); 
        } 
    } 
}
輸出
Key = 0, Value = 0
Key = 1, Value = 1
Key = 2, Value = 2
Key = 3, Value = 3
Key = 4, Value = 4
Key = 5, Value = 5

ConcurrentSkipListMap的方法

METHOD

DESCRIPTION

ceilingEntry(K key) 返回與大於或等於給定鍵的最小鍵關聯的鍵值映射,如果沒有這樣的條目,則返回 null。
ceilingKey(K key) 返回大於或等於給定鍵的最小鍵,如果沒有這樣的鍵,則返回 null。
clear() 從此Map中刪除所有映射。
clone() 返回此 ConcurrentSkipListMap 實例的淺拷貝。
計算(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) 嘗試計算指定鍵及其當前映射值的映射(如果沒有當前映射,則為 null)。
computeIfAbsent(K key, Function<? super K,? 擴展 V> 映射函數) 如果指定的鍵尚未與值關聯,則嘗試使用給定的映射函數計算其值並將其輸入到此映射中,除非為 null。
computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) 如果指定鍵的值存在,則嘗試計算給定鍵及其當前映射值的新映射。
containsKey(Object key) 如果此映射包含指定鍵的映射,則返回 true。
containsValue(Object value) 如果此映射將一個或多個鍵映射到指定值,則返回 true。
entrySet() 返回此映射中包含的映射的集合視圖。
equals(Object o) 比較指定對象與此映射是否相等。
firstEntry() 返回與此映射中最小鍵關聯的鍵值映射,如果映射為空,則返回 null。
firstKey() 返回當前此映射中的第一個(最低)鍵。
floorEntry(K key) 返回與小於或等於給定鍵的最大鍵關聯的鍵值映射,如果不存在這樣的鍵,則返回 null。
floorKey(K key) 返回小於或等於給定鍵的最大鍵,如果沒有這樣的鍵,則返回 null。
get(Object key) 返回指定鍵映射到的值,如果此映射不包含該鍵的映射,則返回 null。
getOrDefault(Object key, V defaultValue) 返回指定鍵映射到的值,如果此映射不包含該鍵的映射,則返回給定的 defaultValue。
headMap(K toKey) 返回此映射的部分視圖,其鍵嚴格小於 toKey。
headMap(K toKey, boolean inclusive) 返回此映射中鍵小於(或等於,如果包含為 true)toKey 的部分的視圖。
higherEntry(K key) 返回與嚴格大於給定鍵的最小鍵關聯的鍵值映射,如果不存在這樣的鍵,則返回 null。
higherKey(K key) 返回嚴格大於給定鍵的最小鍵,如果不存在這樣的鍵,則返回 null。
keySet() 返回此映射中包含的鍵的 NavigableSet 視圖。
lastEntry() 返回與此映射中最大鍵關聯的鍵值映射,如果映射為空,則返回 null。
lastKey() 返回當前此映射中的最後一個(最高)鍵。
lowerEntry(K key) 返回與嚴格小於給定鍵的最大鍵關聯的鍵值映射,如果不存在這樣的鍵,則返回 null。
lowerKey(K key) 返回嚴格小於給定鍵的最大鍵,如果不存在這樣的鍵,則返回 null。
merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction) 如果指定的鍵尚未與值關聯,則將其與給定值關聯。
pollFirstEntry() 刪除並返回與此映射中最小鍵關聯的鍵值映射,如果映射為空,則返回 null。
pollLastEntry() 刪除並返回與此映射中最大鍵關聯的鍵值映射,如果映射為空,則返回 null。
put(K key, V value) 將指定值與此映射中的指定鍵相關聯。
putIfAbsent(K key, V value) 如果指定的鍵尚未與值關聯,則將其與給定值關聯。
ConcurrentSkipListMap remove() 從此映射中刪除指定鍵的映射(如果存在)。
remove(Object key, Object value) 僅當當前映射到給定值時才刪除鍵的條目。
replace(K key, V value) 僅當當前映射到某個值時才替換鍵的條目。
replace(K key, V oldValue, V newValue) 僅當當前映射到給定值時才替換鍵的條目。
subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) 返回此映射的部分視圖,其鍵範圍為 fromKey 到 toKey。
subMap(K fromKey, K toKey) 返回此映射的部分視圖,其鍵範圍從 fromKey(包含)到 toKey(不包含)。
tailMap(K fromKey) 返回此映射中鍵大於或等於 fromKey 的部分的視圖。
tailMap(K fromKey, boolean inclusive) 返回此映射中鍵大於(或等於,如果包含為 true)fromKey 的部分的視圖。
values() 返回此映射中包含的值的集合視圖。

類 java.util.AbstractMap 中聲明的方法

METHOD

DESCRIPTION

AbstractMap hashCode() 返回此映射的哈希代碼值。
AbstractMap isEmpty() 如果此映射不包含鍵值映射,則返回 true。
AbstractMap putAll() 將指定映射中的所有映射複製到此映射(可選操作)。
AbstractMap size() 返回此映射中鍵值映射的數量。
toString() 返回此Map的字符串表示形式。

接口 java.util.concurrent.ConcurrentMap 中聲明的方法

METHOD

DESCRIPTION

forEach(BiConsumer<?超級 K,?超級 V> 操作) 對此映射中的每個條目執行給定的操作,直到處理完所有條目或該操作引發異常。
ReplaceAll(BiFunction<? super K,? super V,? 擴展 V> 函數) 將每個條目的值替換為在該條目上調用給定函數的結果,直到處理完所有條目或函數引發異常。

接口 java.util.concurrent.ConcurrentNavigableMap 中聲明的方法

METHOD

DESCRIPTION

descendingKeySet() 返回此映射中包含的鍵的逆序 NavigableSet 視圖。
descendingMap() 返回此映射中包含的映射的逆序視圖。
navigableKeySet() 返回此映射中包含的鍵的 NavigableSet 視圖。

接口 java.util.Map 中聲明的方法

METHOD

DESCRIPTION

Map hashCode() 返回此映射的哈希代碼值。
Map isEmpty() 如果此映射不包含鍵值映射,則返回 true。
Map putAll() 將指定映射中的所有映射複製到此映射(可選操作)。
Map size() 返回此映射中鍵值映射的數量。

接口 java.util.SortedMap 中聲明的方法

METHOD

DESCRIPTION

SortedMap comparator() 返回用於對該映射中的鍵進行排序的比較器,如果該映射使用其鍵的自然順序,則返回 null。

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



相關用法


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