当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。