模块  java.base
软件包  java.util.concurrent

Interface ConcurrentMap<K,​V>

  • 参数类型
    K - 此映射维护的密钥类型
    V - 映射值的类型
    All Superinterfaces:
    Map<K,​V>
    All Known Subinterfaces:
    ConcurrentNavigableMap<K,​V>
    所有已知实现类:
    ConcurrentHashMapConcurrentSkipListMap

    public interface ConcurrentMap<K,​V>extends Map<K,​V>
    Map提供线程安全性和原子性保证。

    要维护指定的保证,必须通过此接口的实现覆盖从Map继承的方法(包括putIfAbsent(K, V))的默认实现。 类似的,集合的实现返回的方法Map.keySet()Map.values()Map.entrySet()必须覆盖的方法,如removeIf必要时保留原子性保证。

    内存一致性效果:与其他并发集合一样,在将对象放入ConcurrentMap作为键或值之前的线程中的操作ConcurrentMap在另一个线程中从ConcurrentMap访问或删除该对象之后的ConcurrentMap

    此界面是Java Collections Framework的成员。

    从以下版本开始:
    1.5
    • 嵌套类汇总

      • Nested classes/interfaces declared in interface java.util.Map

        Map.Entry<K,​V>
    • 方法摘要

      所有方法  实例方法 抽象方法  Default Methods 
      变量和类型 方法 描述
      default V compute​(K key, BiFunction<? super K,​? super V,​? extends V> remappingFunction)
      尝试计算指定键及其当前映射值的映射(如果没有当前映射, null )。
      default V computeIfAbsent​(K key, Function<? super K,​? extends V> mappingFunction)
      如果指定的键尚未与值关联(或映射到 null ),则尝试使用给定的映射函数计算其值并将其输入此映射,除非 null
      default V computeIfPresent​(K key, BiFunction<? super K,​? super V,​? extends V> remappingFunction)
      如果指定键的值存在且为非null,则尝试在给定键及其当前映射值的情况下计算新映射。
      default void forEach​(BiConsumer<? super K,​? super V> action)
      对此映射中的每个条目执行给定操作,直到处理完所有条目或操作引发异常。
      default V getOrDefault​(Object key, V defaultValue)
      返回指定键映射到的值,如果此映射不包含键的映射,则返回 defaultValue
      default V merge​(K key, V value, BiFunction<? super V,​? super V,​? extends V> remappingFunction)
      如果指定的键尚未与值关联或与null关联,则将其与给定的非空值关联。
      V putIfAbsent​(K key, V value)
      如果指定的键尚未与值关联,请将其与给定值相关联。
      boolean remove​(Object key, Object value)
      仅当前映射到给定值时才删除键的条目。
      V replace​(K key, V value)
      仅当前映射到某个值时才替换键的条目。
      boolean replace​(K key, V oldValue, V newValue)
      仅当前映射到给定值时才替换键的条目。
      default void replaceAll​(BiFunction<? super K,​? super V,​? extends V> function)
      将每个条目的值替换为在该条目上调用给定函数的结果,直到所有条目都已处理或函数抛出异常。
    • 方法详细信息

      • getOrDefault

        default V getOrDefault​(Object key,                       V defaultValue)
        返回指定键映射到的值,如果此映射不包含键的映射,则返回 defaultValue
        Specified by:
        getOrDefault在界面 Map<K,​V>
        Implementation Note:
        此实现假定ConcurrentMap不能包含空值,并且get()明确地返回null意味着密钥不存在。 支持空值的实现必须覆盖此默认实现。
        参数
        key - 要返回其关联值的密钥
        defaultValue - 密钥的默认映射
        结果
        指定键映射到的值,如果此映射不包含键的映射, defaultValue
        异常
        ClassCastException - 如果该地区的密码是不适合的某种类型( optional
        NullPointerException - 如果指定的键为空且此映射不允许空键( optional
        从以下版本开始:
        1.8
      • forEach

        default void forEach​(BiConsumer<? super K,​? super V> action)
        对此映射中的每个条目执行给定操作,直到处理完所有条目或操作引发异常。 除非实现类另有指定,否则将按入口集迭代的顺序执行操作(如果指定了迭代顺序。)操作抛出的异常将中继到调用方。
        Specified by:
        forEach in interface Map<K,​V>
        实现要求:
        对于此map ,默认实现等效于:
           for (Map.Entry<K,V> entry : map.entrySet()) { action.accept(entry.getKey(), entry.getValue()); } 
        Implementation Note:
        默认实现假定IllegalStateException通过抛出getKey()getValue()表示该条目已被删除,无法处理。 后续条目继续操作。
        参数
        action - 要为每个条目执行的操作
        异常
        NullPointerException - 如果指定的操作为null
        从以下版本开始:
        1.8
      • putIfAbsent

        V putIfAbsent​(K key,              V value)
        如果指定的键尚未与值关联,请将其与给定值相关联。 对于这个map ,这map
           if (!map.containsKey(key)) return map.put(key, value); else return map.get(key); 
        除了动作以原子方式执行。
        Specified by:
        putIfAbsent在界面 Map<K,​V>
        Implementation Note:
        此实现有意重新抽象 Map提供的不当默认值。
        参数
        key - 与指定值关联的键
        value - 与指定密钥关联的值
        结果
        与指定键关联的先前值,如果没有键的映射, null (A null返回也可以指示以前与null关联的映射,如果实现支持空值。)
        异常
        UnsupportedOperationException - 如果此地图不支持 put操作
        ClassCastException - 如果指定键或值的类阻止它存储在此映射中
        NullPointerException - 如果指定的键或值为null,并且此映射不允许空键或值
        IllegalArgumentException - 如果指定键或值的某些属性阻止它存储在此映射中
      • remove

        boolean remove​(Object key,               Object value)
        仅当前映射到给定值时才删除键的条目。 对于这个map ,这map
           if (map.containsKey(key) && Objects.equals(map.get(key), value)) { map.remove(key); return true; } else { return false; } 
        除了动作以原子方式执行。
        Specified by:
        remove在界面 Map<K,​V>
        Implementation Note:
        此实现有意重新抽象 Map提供的不适当的默认值。
        参数
        key - 与指定值关联的键
        value - 期望与指定密钥关联的值
        结果
        true如果值已被删除
        异常
        UnsupportedOperationException - 如果此地图不支持 remove操作
        ClassCastException - 如果该地图或不正确的类型或者是对此地图的价格不正确( optional
        NullPointerException - 如果指定的键或值为null,并且此映射不允许空键或值( optional
      • replace

        boolean replace​(K key,                V oldValue,                V newValue)
        仅当前映射到给定值时才替换键的条目。 对于这个map ,这map
           if (map.containsKey(key) && Objects.equals(map.get(key), oldValue)) { map.put(key, newValue); return true; } else { return false; } 
        除了动作以原子方式执行。
        Specified by:
        replace ,界面 Map<K,​V>
        Implementation Note:
        此实现有意重新抽象 Map提供的不适当的默认值。
        参数
        key - 与指定值关联的键
        oldValue - 期望与指定键关联的值
        newValue - 与指定键关联的值
        结果
        true如果值已被替换
        异常
        UnsupportedOperationException - 如果此地图不支持 put操作
        ClassCastException - 如果指定键或值的类阻止它存储在此映射中
        NullPointerException - 如果指定的键或值为null,并且此映射不允许空键或值
        IllegalArgumentException - 如果指定键或值的某些属性阻止它存储在此映射中
      • replace

        V replace​(K key,          V value)
        仅当前映射到某个值时才替换键的条目。 对于这个map ,这map
           if (map.containsKey(key)) return map.put(key, value); else return null; 
        除了动作以原子方式执行。
        Specified by:
        replace在界面 Map<K,​V>
        Implementation Note:
        此实现有意重新抽象 Map提供的不适当的默认值。
        参数
        key - 与指定值关联的键
        value - 与指定键关联的值
        结果
        与指定键关联的先前值,如果没有键的映射, null (如果实现支持空值,则返回null也可以指示该映射先前与null关联。)
        异常
        UnsupportedOperationException - 如果此地图不支持 put操作
        ClassCastException - 如果指定键或值的类阻止它存储在此映射中
        NullPointerException - 如果指定的键或值为null,并且此映射不允许空键或值
        IllegalArgumentException - 如果指定键或值的某些属性阻止它存储在此映射中
      • replaceAll

        default void replaceAll​(BiFunction<? super K,​? super V,​? extends V> function)
        将每个条目的值替换为在该条目上调用给定函数的结果,直到所有条目都已处理或函数抛出异常。 函数抛出的异常被转发给调用者。
        Specified by:
        replaceAll在界面 Map<K,​V>
        实现要求:

        对于此map ,默认实现等效于:

           for (Map.Entry<K,V> entry : map.entrySet()) { K k; V v; do { k = entry.getKey(); v = entry.getValue(); } while (!map.replace(k, v, function.apply(k, v))); } 
        当多个线程尝试更新时,默认实现可以重试这些步骤,包括可能针对给定键重复调用该函数。

        此实现假定ConcurrentMap不能包含空值,并且get()明确地返回null意味着密钥不存在。 支持空值的实现必须覆盖此默认实现。

        参数
        function - 要应用于每个条目的功能
        异常
        UnsupportedOperationException - 如果此映射的条目集迭代器不支持 set操作。
        NullPointerException - 如果函数或替换值为null,并且此映射不允许空键或值( optional
        ClassCastException - 如果此地图的替代值的 ClassCastException不恰当( optional
        IllegalArgumentException - 如果替换值的某些属性阻止将其存储在此映射中( optional
        从以下版本开始:
        1.8
      • computeIfAbsent

        default V computeIfAbsent​(K key,                          Function<? super K,​? extends V> mappingFunction)
        如果指定的键尚未与值关联(或映射到null ),则尝试使用给定的映射函数计算其值并将其输入此映射,除非null

        如果映射函数返回null ,则不记录映射。 如果映射函数本身抛出(未经检查的)异常,则重新抛出异常,并且不记录映射。 最常见的用法是构造一个新对象,用作初始映射值或记忆结果,如:

           map.computeIfAbsent(key, k -> new Value(f(k)));  

        或者实现一个多值映射Map<K,Collection<V>> ,每个键支持多个值:

           map.computeIfAbsent(key, k -> new HashSet<V>()).add(v);  

        映射函数不应在计算期间修改此映射。

        Specified by:
        computeIfAbsent ,界面 Map<K,​V>
        实现要求:
        默认实现等效于此map的以下步骤:
           V oldValue, newValue; return ((oldValue = map.get(key)) == null && (newValue = mappingFunction.apply(key)) != null && (oldValue = map.putIfAbsent(key, newValue)) == null) ? newValue : oldValue; 

        此实现假定ConcurrentMap不能包含空值,并且get()明确地返回null意味着密钥不存在。 支持空值的实现必须覆盖此默认实现。

        参数
        key - 与指定值关联的键
        mappingFunction - 计算值的映射函数
        结果
        与指定键关联的当前(现有或已计算)值,如果计算值为null,则为null
        异常
        UnsupportedOperationException -如果 put操作不受此地图支持( optional
        ClassCastException - 如果指定键或值的类阻止它存储在此映射中( optional
        NullPointerException - 如果指定的键为null且此映射不支持null键,或者mappingFunction为null
        IllegalArgumentException - 如果指定键或值的某些属性阻止将其存储在此映射中( optional
        从以下版本开始:
        1.8
      • computeIfPresent

        default V computeIfPresent​(K key,                           BiFunction<? super K,​? super V,​? extends V> remappingFunction)
        如果指定键的值存在且为非null,则尝试在给定键及其当前映射值的情况下计算新映射。

        如果重映射功能返回null ,则删除映射。 如果重映射函数本身抛出(未经检查的)异常,则重新抛出异常,并保持当前映射不变。

        重映射功能不应在计算期间修改此映射。

        Specified by:
        computeIfPresent ,界面 Map<K,​V>
        实现要求:
        默认实现相当于对此map执行以下步骤:
           for (V oldValue; (oldValue = map.get(key)) != null; ) { V newValue = remappingFunction.apply(key, oldValue); if ((newValue == null) ? map.remove(key, oldValue) : map.replace(key, oldValue, newValue)) return newValue; } return null; 
        当多个线程尝试更新时,可以多次调用映射操作和重映射功能。

        此实现假定ConcurrentMap不能包含空值,并且get()明确地返回null意味着密钥不存在。 支持空值的实现必须覆盖此默认实现。

        参数
        key - 与指定值关联的键
        remappingFunction - 用于计算值的重映射函数
        结果
        与指定键关联的新值,如果没有,则返回null
        异常
        UnsupportedOperationException -如果 put操作不受此地图支持( optional
        ClassCastException - 如果指定键或值的类阻止它存储在此映射中( optional
        NullPointerException - 如果指定的键为null且此映射不支持null键,或者remappingFunction为null
        IllegalArgumentException - 如果指定键或值的某些属性阻止它存储在此映射中( optional
        从以下版本开始:
        1.8
      • compute

        default V compute​(K key,                  BiFunction<? super K,​? super V,​? extends V> remappingFunction)
        尝试计算指定键及其当前映射值的映射(如果没有当前映射, null )。 例如,要创建或附加String消息到值映射:
           map.compute(key, (k, v) -> (v == null) ? msg : v.concat(msg)) 
        (方法merge()通常更易于用于此类目的。)

        如果重映射函数返回null ,则删除映射(或者如果最初不存在则保持不存在)。 如果重映射函数本身抛出(未经检查的)异常,则重新抛出异常,并保持当前映射不变。

        重映射功能不应在计算期间修改此映射。

        Specified by:
        compute在接口 Map<K,​V>
        实现要求:
        默认实现等同于对此map执行以下步骤:
           for (;;) { V oldValue = map.get(key); V newValue = remappingFunction.apply(key, oldValue); if (newValue != null) { if ((oldValue != null) ? map.replace(key, oldValue, newValue) : map.putIfAbsent(key, newValue) == null) return newValue; } else if (oldValue == null || map.remove(key, oldValue)) { return null; } } 
        当多个线程尝试更新时,可以多次调用映射操作和重映射功能。

        此实现假定ConcurrentMap不能包含空值,并且get()明确地返回null意味着密钥不存在。 支持空值的实现必须覆盖此默认实现。

        参数
        key - 与指定值关联的键
        remappingFunction - 用于计算值的重映射函数
        结果
        与指定键关联的新值,如果没有,则返回null
        异常
        UnsupportedOperationException -如果 put操作不受此地图支持( optional
        ClassCastException - 如果指定键或值的类阻止它存储在此映射中( optional
        NullPointerException - 如果指定的键为null且此映射不支持null键,或者remappingFunction为null
        IllegalArgumentException - 如果指定键或值的某些属性阻止它存储在此映射中( optional
        从以下版本开始:
        1.8
      • merge

        default V merge​(K key,                V value,                BiFunction<? super V,​? super V,​? extends V> remappingFunction)
        如果指定的键尚未与值关联或与null关联,则将其与给定的非空值关联。 否则,将相关值替换为给定重映射函数的结果,或者如果结果为nullnull 当组合密钥的多个映射值时,该方法可以是有用的。 例如,要创建或附加String msg到值映射:
           map.merge(key, msg, String::concat)  

        如果重映射功能返回null ,则删除映射。 如果重映射函数本身抛出(未经检查的)异常,则重新抛出异常,并保持当前映射不变。

        重映射功能不应在计算期间修改此映射。

        Specified by:
        merge in interface Map<K,​V>
        实现要求:
        默认实现相当于对此map执行以下步骤:
           for (;;) { V oldValue = map.get(key); if (oldValue != null) { V newValue = remappingFunction.apply(oldValue, value); if (newValue != null) { if (map.replace(key, oldValue, newValue)) return newValue; } else if (map.remove(key, oldValue)) { return null; } } else if (map.putIfAbsent(key, value) == null) { return value; } } 
        当多个线程尝试更新时,可以多次调用映射操作和重映射功能。

        此实现假定ConcurrentMap不能包含空值,并且get()明确地返回null意味着密钥不存在。 支持空值的实现必须覆盖此默认实现。

        参数
        key - 与结果值关联的键
        value - 要与与键关联的现有值合并的非空值,或者,如果没有现有值或与键关联的空值,则与键关联
        remappingFunction - 重新映射函数,用于重新计算值(如果存在)
        结果
        与指定键关联的新值,如果没有值与键关联,则返回null
        异常
        UnsupportedOperationException -如果 put操作不受此地图支持( optional
        ClassCastException - 如果指定键或值的类阻止它存储在此映射中( optional
        NullPointerException - 如果指定的键为null且此映射不支持null键或值或remappingFunction为null
        IllegalArgumentException - 如果指定键或值的某些属性阻止它存储在此映射中( optional
        从以下版本开始:
        1.8