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的层次结构
声明:
public interface ConcurrentMap<K,V> extends Map<K,V>
这里,K是键Object的类型,V是值Object的类型。
- 它扩展了 Map interface in Java 。
- ConcurrentNavigableMap<K,V> 是子接口。
- ConcurrentMap 的实现方式是ConcurrentHashMap,ConcurrentSkipListMap类。
- ConcurrentMap 被称为同步映射。
实现类
由于它属于java.util.concurrent包,我们必须导入正在使用
import java.util.concurrent.ConcurrentMap or import java.util.concurrent.*
ConcurrentMap 有两个实现类,它们是ConcurrentSkipListMap和ConcurrentHashMap。 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
相关用法
- Java ConcurrentModificationException用法及代码示例
- Java ConcurrentHashMap computeIfPresent()用法及代码示例
- Java ConcurrentHashMap equals()用法及代码示例
- Java ConcurrentHashMap forEach()用法及代码示例
- Java ConcurrentHashMap getOrDefault()用法及代码示例
- Java ConcurrentHashMap hashcode()用法及代码示例
- Java ConcurrentHashMap mappingCount()用法及代码示例
- Java ConcurrentHashMap merge()用法及代码示例
- Java ConcurrentHashMap newKeySet()用法及代码示例
- Java ConcurrentHashMap replace()用法及代码示例
- Java ConcurrentHashMap toString()用法及代码示例
- Java ConcurrentLinkedQueue forEach()用法及代码示例
- Java ConcurrentLinkedQueue removeAll()用法及代码示例
- Java ConcurrentLinkedQueue removeIf()用法及代码示例
- Java ConcurrentLinkedQueue retainAll()用法及代码示例
- Java ConcurrentHashMap contains()用法及代码示例
- Java ConcurrentHashMap containsKey()用法及代码示例
- Java ConcurrentHashMap containsValue()用法及代码示例
- Java ConcurrentHashMap elements()用法及代码示例
- Java ConcurrentHashMap entrySet()用法及代码示例
- Java ConcurrentHashMap get()用法及代码示例
- Java ConcurrentHashMap isEmpty()用法及代码示例
- Java ConcurrentHashMap keys()用法及代码示例
- Java ConcurrentHashMap keySet()用法及代码示例
- Java ConcurrentHashMap put()用法及代码示例
注:本文由纯净天空筛选整理自bishaldubey大神的英文原创作品 ConcurrentMap Interface in java。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。