java - 为什么 Map 接口中有一个 'remove(key, value)' 方法?
问题描述
我刚刚发现只有在当前映射到指定值时才Map
公开“ [删除]指定键的条目。 ”的方法。它被定义为:
default boolean remove(Object key, Object value)
我无法想出在我自己的自定义地图界面中包含此方法的理由。我很好奇,为什么有人要这样做?有人可以提供一个默认情况下不可替代的算法示例remove(key)
(没有“值”参数)吗?
解决方案
该方法的 Javadoc 对此进行了解释:
对于此地图,默认实现等效于:
if (map.containsKey(key) && Objects.equals(map.get(key), value)) { map.remove(key); return true; } else return false;
默认实现不保证此方法的同步或原子性属性。任何提供原子性保证的实现都必须覆盖此方法并记录其并发属性。
一般来说,只要你没有原子性保证,就不要覆盖它并使用上面的默认实现。
当多个线程访问同一个 Map 时,这在并发编程中很有用。您将需要一个ConcurrentHashMap
为remove(Object, Object)
.
例如,像那样的东西(想象ConcurrentHashMap<String, String> cache
在线程之间共享):
String key = ...;
String value = cache.get(key);
//long lasting operation
cache.remove(key, value);
在那个“长期操作”期间,另一个线程可能已经更新了分配给key
. 如果它仍然被分配给与以前相同的值,您只希望删除该键。
推荐阅读
- talend - 如何在同一个子作业中读取和写入 Talend 中的同一个 excel 文件?
- python - 如何将字符串列表与另一个匹配
- python - discord.py - 意外的关键字参数错误
- reactjs - 功能组件嵌套与道具
- c - 检查列表是否为交替值
- c# - PresentationFramework.dll 中的 System.Windows.Markup.XamlParseException' 方法或操作未实现。(材料消息框)
- objective-c - 奇怪的 KERN_INVALID_ADDRESS 异常?
- python - 如何在不引用输出的情况下从 SQL 数据库获取密码?
- vue.js - PrimeVue:带有服务器端分页的数据表
- paypal-rest-sdk - Paypal 智能按钮信用卡填写或隐藏电话号码