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


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