在java *中将值放入映射中,而不存在*更新现有值(如果存在)

时间:2011-12-09 20:14:37

标签: java collections map

我想要执行以下功能:

if (!map.contains(key)) {
  map.put(key, val);
}

更新:我们假设它不是HashMap所以地图是以某种树形式实现的。

然而请注意,它有点效率低,因为如果我们进入实际上我们实际搜索地图两次。我其实想做类似的事情:

map.put_if_new_key(key, val);

知道怎么用Java做的吗?

4 个答案:

答案 0 :(得分:7)

如果您希望绝大部分时间都插入新元素。

ValType temp = map.put(key, val);
if(temp != null)
    map.put(key, temp);

我认为这不是一个好主意,但是如果你可以充分说明你的用例,那么值得考虑。

如果您可以使用特定的地图实现而不仅仅是地图界面,那么可以使用NavigableMap

进行第二次考虑
Map sub = map.subMap(key, true, key, true);
if (!sub.contains(key)) {
  sub.put(key, val);
}

由于子树将是0或1个节点,因此没有重复的工作。

答案 1 :(得分:3)

如果您有ConcurrentMap<K, V>,则方法为putIfAbsent

  

如果指定的键尚未与值关联,请将其与给定值相关联。这相当于

if (!map.containsKey(key))
    return map.put(key, value);
else
    return map.get(key);
     

除了动作以原子方式执行。

Map<K, V>上不存在此方法。

答案 2 :(得分:1)

我不认为您提出的代码效率低下。查看地图中是否已存在key,然后查看单个地图查找。即使对于未找到密钥的情况,也没有2次搜索。只有1次搜索,1次插入地图。

答案 3 :(得分:0)

我认为没有办法检查“contains()”以查看密钥是否存在。

看看这里是否可以替代你:

What happens when a duplicate key is put into a HashMap?