Map.containsKey()有用吗?

时间:2013-05-06 12:02:08

标签: java map

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

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

不使用containsKey的示例:

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

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

3 个答案:

答案 0 :(得分: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。)

答案 1 :(得分:5)

如果您的地图允许null值,只有get(key),则无法区分值为null且“没有匹配的键/值对的键/值对存在”。

答案 2 :(得分: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"));
}