在Map中使用null的奇怪结果

时间:2013-07-14 09:13:42

标签: java map null

我运行了以下代码

public class MapTest {    
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put(null, null);
        System.out.println(map.get(null));
        System.out.println(map.containsKey(null));
        System.out.println(map.containsValue(null));
    }
}

它给出了这个输出

null
true
true

但是,当我删除该行map.put(null, null)时,map.get(null)仍会返回null,但map.containsKey(null)&amp; map.containsValue(null)返回false。现在,如果值null未与任何键相关联,那么map.get(null)如何仍然可以返回null

5 个答案:

答案 0 :(得分:2)

Map接口的Javadoc声明get应该为没有映射的任何键返回null

  

返回指定键映射到的值,如果此映射不包含键的映射,则返回null。

但请注意,某些Map实施可能不允许null个密钥,在这种情况下,map.get(null)会抛出NullPointerException。这方面的一个例子是ConcurrentHashMap

答案 1 :(得分:0)

如果地图未在地图中找到该值,则get(object)仍会返回null

因此,对于任意值,您也将获得null。

答案 2 :(得分:0)

map.get(null)返回null,因为:

Java Hash Map get Method

  

返回指定键映射到的值,如果此映射不包含键的映射,则返回null。

     

更正式地说,如果此映射包含从键k到值v的映射,使得(key == null?k == null:key.equals(k)),则此方法返回v;否则返回null。 (最多可以有一个这样的映射。)

     

返回值null不一定表示映射不包含键的映射;地图也可能将键明确映射为null。 containsKey操作可用于区分这两种情况。

这是可能的:

map.put(null, null);

因为:

Java Hash Map

  

此实现提供所有可选的映射操作,并允许空值和空键。

答案 3 :(得分:0)

这是除了HashMap的get()源代码之外:

public V get(Object key) {
   if (key == null)
     return getForNullKey();
   ...
}

如果传递的密钥是null,它将获取该密钥并返回与之关联的值,否则返回null。

 private V getForNullKey() {
     for (Entry<K,V> e = table[0]; e != null; e = e.next) {
         if (e.key == null)
            return e.value;
     }
     return null;
 }

答案 4 :(得分:0)

这里没有奇怪的行为。 Map是java集合框架中的接口,HashMap是实现。

简单映射是一种允许存储密钥,值对的数据结构。

在这里,您将null作为键,将null作为值。由于HashMap<String,Integer>String默认值为Integers,您的null接受这些值。

然后你正在打电话

  

map.get(null)//参数是一个键,返回值分配给该键。所以你得到了空。

     

map.containsKey(null)//如果存在特定键,则此方法返回true。在这种情况下,null是您的密钥,因为返回true   map.containsKey(null)//如果may中的值为null,则此方法返回true。这种情况也是如此。

下次因为map为空而且整数默认值为null,所以你得到null。显然,由于map为空,其他两个方法返回false。

相关问题