我运行了以下代码
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
?
答案 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,因为:
返回指定键映射到的值,如果此映射不包含键的映射,则返回null。
更正式地说,如果此映射包含从键k到值v的映射,使得(key == null?k == null:key.equals(k)),则此方法返回v;否则返回null。 (最多可以有一个这样的映射。)
返回值null不一定表示映射不包含键的映射;地图也可能将键明确映射为null。 containsKey操作可用于区分这两种情况。
这是可能的:
map.put(null, null);
因为:
此实现提供所有可选的映射操作,并允许空值和空键。
答案 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。