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的层次结构
它实现了可串行化,可克隆,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。 |
相关用法
- Java ConcurrentSkipListMap ceilingKey()用法及代码示例
- Java ConcurrentSkipListMap clear()用法及代码示例
- Java ConcurrentSkipListMap clone()用法及代码示例
- Java ConcurrentSkipListMap containsKey()用法及代码示例
- Java ConcurrentSkipListMap containsValue()用法及代码示例
- Java ConcurrentSkipListMap equals()用法及代码示例
- Java ConcurrentSkipListMap isEmpty()用法及代码示例
- Java ConcurrentSkipListMap put()用法及代码示例
- Java ConcurrentSkipListMap remove()用法及代码示例
- Java ConcurrentSkipListMap size()用法及代码示例
- Java ConcurrentSkipListSet add()用法及代码示例
- Java ConcurrentSkipListSet ceiling()用法及代码示例
- Java ConcurrentSkipListSet clear()用法及代码示例
- Java ConcurrentSkipListSet clone()用法及代码示例
- Java ConcurrentSkipListSet comparator()用法及代码示例
- Java ConcurrentSkipListSet contains()用法及代码示例
- Java ConcurrentSkipListSet descendingIterator()用法及代码示例
- Java ConcurrentSkipListSet descendingSet()用法及代码示例
- Java ConcurrentSkipListSet equals()用法及代码示例
- Java ConcurrentSkipListSet first()用法及代码示例
- Java ConcurrentSkipListSet floor()用法及代码示例
- Java ConcurrentSkipListSet headSet()用法及代码示例
- Java ConcurrentSkipListSet higher()用法及代码示例
- Java ConcurrentSkipListSet isEmpty()用法及代码示例
- Java ConcurrentSkipListSet iterator()用法及代码示例
注:本文由纯净天空筛选整理自Ganeshchowdharysadanala大神的英文原创作品 ConcurrentSkipListMap in Java with Examples。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。