Map.containsKey() 有用吗?

7

我在想,在尝试访问之前检查特定的键是否存在,这样做有意义吗?例如:

Map myMap ....
if myMap.containsKey(key) {
   Object value = myMap.get(key);
   .....
}

不使用 containsKey 的示例:

Object value = myMap.get(key);
if (value != null) {
 ......
}

编辑:关于 null 键和值的澄清。假设这个映射不允许有 null 键和 null 值,那么这两个例子就是相同的。


重复的:https://dev59.com/pWUq5IYBdhLWcg3wT-yD - Pablo
这既是一个重复的问题,又不适合在SO上提问。 - T.J. Crowder
@dhblah,你的编辑使得你的问题完全变成了另一个问题。 - Uooo
3个回答

16

是的 - 键可以具有null值:

Map myMap = ...;
myMap.put("foo", null);
if (myMap.containsKey("foo")) {
   Object value = myMap.get(key); // value is null
}

Object value = myMap.get("foo");
if (value != null) {
    // you won't get here
}

你可以争论(我也同意)当Java的集合API首次发布时,不区分null值和不存在的条目是一个相当糟糕的设计决策。
(一些地图 - 至少HashtableConcurrentHashMap - 不允许null值,这使得containsKey在那里变得不那么重要,但它仍然比m.get(k) == null更易读。)

5

如果你的地图允许null值,那么仅使用get(key)无法区分值为null和"没有匹配的键/值对"。


1

是的,它很有用 - 尤其是如果您的地图允许null值...

@Test
public void testContainsKey() {
    Map<String, Object> strObjMap = new HashMap<String, Object>();
    strObjMap.put("null", null);

    assertTrue(strObjMap.containsKey("null"));
    assertNull(strObjMap.get("null"));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接