2012-06-04 39 views
5

好吧,这是我不明白的一点。
如果尝试使用get()方法检索对象并返回null,则仍可能将null存储为与您提供给get()方法的密钥关联的对象。您可以通过将对象的密钥传递给containsKey()方法来确定是否属于这种情况。这将返回true如果密钥存储在地图
那么,如何containsKey()应该告诉我,如果用随附的键关联的null
这是the reference如果你想检查。第553了解哈希图<K,V>

回答

4

考虑的代码这个简单的片断:

Map<String, String> m = new HashMap<String, String>(); 
m.put("key1", "value1"); 
m.put("key2", null); 

System.out.println("m.get(\"key1\")=" + m.get("key1")); 
System.out.println("m.containsKey(\"key1\")=" + m.containsKey("key1")); 

System.out.println("m.get(\"key2\")=" + m.get("key2")); 
System.out.println("m.containsKey(\"key2\")=" + m.containsKey("key2")); 

System.out.println("m.get(\"key3\")=" + m.get("key3")); 
System.out.println("m.containsKey(\"key3\")=" + m.containsKey("key3")); 

正如你可以看到我把地图上的两个值,其中一个是空。我问了地图三个值:其中两个存在(一个为空),一个不存在。看看结果:

m.get("key1")=value1 
m.containsKey("key1")=true 
m.get("key2")=null 
m.containsKey("key2")=true 
m.get("key3")=null 
m.containsKey("key3")=false 

第二个和第三个是棘手的部分。 key2存在空值,因此,使用get(),您无法区分该元素是否不在地图中,或者是否在具有null值的地图中。但是,使用containsKey()即可,因为它返回boolean

+0

好吧,正确解释它。在现实生活中,我必须首先使用'containsKey()'来检查键是否有效,然后显示与之相关的值。如果没有,那么显示一条消息或抛出一个异常:) –

+0

@FasihKhatib只有当你在Map中存储'null'时才真正需要。如果你从不在Map中存储'null',那么在检查有效的空映射方面没有太多的意义。 –

9
Map<String, Object> map = new HashMap<String, Object>(); 
map.put("Foo", null); 
System.out.println(map.containsKey("Foo")); 
System.out.println(map.containsKey("Boo")); 

OUTPUT:

true 
false 

get()返回null在两种情况下:

  • 的关键并不在地图存在。
  • 关键确实存在,但关联值为null

get()你不能告诉哪个是真的。但是,containsKey()会告诉您密钥是否存在于地图中,而不管其关联值是否为null

+2

+1 - 编辑澄清 –

+0

这几乎是我在上面的帖子中所说的。 – FSP

+0

是的,这本书说的是它应该帮助我检查HashMap 的V值是否为空。 –

1

containsKey会告诉你密钥是否在hashmap中。考虑一个密钥存在空值的情况,以及另一种情况,即你正在查找的密钥根本不在哈希映射中。

+0

+1正确的答案。 –

3
(get() == null && containsKey()) == value is null