1

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

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

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

后来我发现 key 是 null ,我更正了。

但后来我看到了put方法的代码Hashmap

key为什么它在is时不给出异常null

它调用putForNullKey私有方法。它有什么作用?

但我认为如果密钥为空,它应该给出一些例外。

为什么他们没有那样实施呢?如果键为空,键值对没有用吗?

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

4

3 回答 3

4

来自 HashMap 的 Javadoc:

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 依赖于 key 的 hashCode() 来放置它,并且由于它无法从 null 值中获取 hashCode(),所以它必须作为一种特殊情况来做。

于 2013-04-22T17:03:41.857 回答
1

Hashtable这是 a和 a之间的区别之一HashMap

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

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

于 2013-04-22T17:05:59.577 回答
1

HashMap 只允许一个空键。因此,每当有人想将某个值放入 null 时,它会在 put 方法中调用 putForNullKey 方法,并在 putForNullKey 方法中将值放在零索引处。

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

于 2013-04-22T17:07:21.923 回答