我想知道,在尝试访问它之前检查特定密钥是否有意义。例如:
Map myMap ....
if myMap.containsKey(key) {
Object value = myMap.get(key);
.....
}
不使用containsKey
的示例:
Object value = myMap.get(key);
if (value != null) {
......
}
编辑:澄清空键和值。假设该映射不允许使用null键和空值,因此这两个示例完全相同。
答案 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
值和不存在的条目是一个非常糟糕的设计决定。
(有些地图 - 至少Hashtable
和ConcurrentHashMap
- 不允许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"));
}