7

我想知道,在尝试访问特定密钥之前检查它是否有意义。例子:

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

不使用的例子containsKey

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

编辑:澄清空键和值。假设该映射不允许空键和空值,因此这两个示例是相同的。

4

3 回答 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
}

你可以争辩(我同意)null当他们第一次制作 Java 的集合 API 时,不区分值和不存在的条目是一个非常糟糕的设计决策。

(一些地图 -Hashtable至少ConcurrentHashMap- 不允许使用null值,这在containsKey那里变得不那么重要,但它仍然是一个很好的可读性改进m.get(k) == null。)

于 2013-05-06T12:04:42.817 回答
5

如果您的地图允许null值,只是get(key)您无法区分具有 value = 的null键/值对和“不存在匹配的键/值对”。

于 2013-05-06T12:05:54.907 回答
1

是的,它很有用 - 特别是如果您的 Map 允许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"));
}
于 2013-05-06T12:07:23.517 回答