0

我运行了以下代码

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

但是,当我删除 line 时map.put(null, null)map.get(null)仍然返回 null,但是map.containsKey(null)& map.containsValue(null)return false。现在,如果该值null不与任何键相关联,怎么可能map.get(null)仍然返回null

4

5 回答 5

2

Map接口状态的 Javadocget应该null为没有映射的任何键返回:

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

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

于 2013-07-14T09:16:33.447 回答
0

如果地图在地图中没有找到值,那么get(object)仍然返回null

因此,对于任何任意值,您也会得到 null 。

于 2013-07-14T09:16:49.623 回答
0

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

Java Hash Map 获取方法

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

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

返回值为 null 并不一定表示该映射不包含该键的映射;映射也可能将键显式映射为空。containsKey 操作可用于区分这两种情况。

这个有可能:

map.put(null, null);

因为:

Java 哈希映射

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

于 2013-07-14T09:19:14.690 回答
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;
 }
于 2013-07-14T09:23:44.523 回答
0

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

简单来说,map 是一种允许存储键值对的数据结构。

在这里,您将 null 作为键,将 null 作为值。您HashMap<String,Integer>接受这些值,因为String默认Integers值是null.

然后你在打电话

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

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

下一次你得到 null 因为 map 是空的并且 Integers 默认值为 null。显然其他两种方法返回 false 因为 map 是空的。

于 2013-07-14T10:04:09.477 回答