【问题标题】:Is Map.containsKey() useful? [duplicate]Map.containsKey() 有用吗? [复制]
【发布时间】:2013-05-06 12:02:07
【问题描述】:

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

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

不使用containsKey的例子:

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

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

【问题讨论】:

标签: java map


【解决方案1】:

是的 - 键可以有 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 相比,它仍然是一个很好的可读性改进。)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      是的,它很有用 - 特别是如果您的地图允许 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"));
      }
      

      【讨论】:

        猜你喜欢
        • 2012-01-16
        • 1970-01-01
        • 2012-07-21
        • 2018-02-03
        • 2011-04-17
        • 2015-06-30
        • 1970-01-01
        • 2013-01-14
        • 1970-01-01
        相关资源
        最近更新 更多