首页 > 解决方案 > 为什么 Map 接口中有一个 'remove(key, value)' 方法?

问题描述

我刚刚发现只有在当前映射到指定值时才Map公开“ [删除]指定键的条目。 ”的方法。它被定义为:

default boolean remove(Object key, Object value)

我无法想出在我自己的自定义地图界面中包含此方法的理由。我很好奇,为什么有人要这样做?有人可以提供一个默认情况下不可替代的算法示例remove(key)(没有“值”参数)吗?

标签: javadictionary

解决方案


该方法的 Javadoc 对此进行了解释:

对于此地图,默认实现等效于:

 if (map.containsKey(key) && Objects.equals(map.get(key), value)) {
     map.remove(key);
     return true;
 } else
     return false;
 

默认实现不保证此方法的同步或原子性属性。任何提供原子性保证的实现都必须覆盖此方法并记录其并发属性。

一般来说,只要你没有原子性保证,就不要覆盖它并使用上面的默认实现。

当多个线程访问同一个 Map 时,这在并发编程中很有用。您将需要一个ConcurrentHashMapremove(Object, Object).

例如,像那样的东西(想象ConcurrentHashMap<String, String> cache在线程之间共享):

String key = ...;
String value = cache.get(key);
//long lasting operation
cache.remove(key, value);

在那个“长期操作”期间,另一个线程可能已经更新了分配给key. 如果它仍然被分配给与以前相同的值,您只希望删除该键。


推荐阅读