为什么在map接口中有一个“remove(key,value)”方法?

iyr7buue  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(370)

我刚发现 Map 公开一个方法,用于“[删除]仅当指定键的项当前Map到指定值时”的方法。定义为:

default boolean remove(Object key, Object value)

我想不出在我自己的自定义Map的接口中包含此方法的原因。我很好奇,为什么有人要这么做?有人能举一个默认情况下不可替代的算法的例子吗 remove(key) (没有'value'参数)?

nuypyhwy

nuypyhwy1#

该方法的javadoc解释道:
对于此Map,默认实现等效于:

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

默认实现不保证此方法的同步性或原子性属性。任何提供原子性保证的实现都必须重写此方法并记录其并发属性。
一般来说,只要没有原子性保证,就不要重写它并使用上面的默认实现。
当多个线程访问同一Map时,这在并发编程中非常有用。你需要一个 ConcurrentHashMap 它为 remove(Object, Object) .
例如,smth就是这样(想象一下) ConcurrentHashMap<String, String> cache 在线程之间共享):

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

在那个“持久操作”期间,另一个线程可能已经更新了分配给它的值 key . 只有当键仍被指定给与以前相同的值时,才希望将其删除。

相关问题