`putForNullKey`方法在hashmap中的`put`方法中做了什么?

时间:2013-04-22 16:59:08

标签: java collections hashmap

今天我修复了一个缺陷,发现了一个非常有趣的事情。

我试图在hashmap中放置一个键值对。 (我假设密钥在那里,但后来发现它是空的。)

因此,在使用键检索值时,每次都没有得到null。

后来我发现密钥为空,我纠正了它。

但后来我看到put的{​​{1}}方法的代码。

为什么Hashmapkey

时,它不会出现异常

它调用null私有方法。它做了什么?

但我认为如果密钥为空则应该给出一些异常。

为什么他们没有像那样实现它? 如果键为空,键值对无效?

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/HashMap.java#HashMap.putForNullKey%28java.lang.Object%29

3 个答案:

答案 0 :(得分:4)

从Javadoc for HashMap:

Hash table based implementation of the Map interface.
This implementation provides all of the optional map
operations, and permits null values and the null key

这是设计的,并且有记录。 “为什么”这个问题很难回答,但是自从HashMap(以及之前的Hashtable)被引入以来就是这样(编辑,实际上,Hashtable不允许空值)。

至于为什么它有putForNullKey,HashMap依赖于键的hashCode()来放置它,并且,因为它无法从null值获取hashCode(),所以它必须作为一个特例。

答案 1 :(得分:1)

这是HashtableHashMap之间的差异之一。

Hashtable不允许使用null键或值。 HashMap允许一个空键和任意数量的空值。

通常,我们使用null键来表示默认情况(即,如果给定的密钥不存在,应该使用的值)

答案 2 :(得分:0)

HashMap只允许一个空键。因此,每当任何人想要使用null放置一些值时,它会在put方法中调用putForNullKey方法,而在putForNullKey方法中,它将值放在零索引处。

为了通过null键获取值,它还有一个方法getForNullKey,它从get方法内部调用。