今天我修复了一个缺陷,发现了一个非常有趣的事情。
我试图在hashmap中放置一个键值对。 (我假设密钥在那里,但后来发现它是空的。)
因此,在使用键检索值时,每次都没有得到null。
后来我发现密钥为空,我纠正了它。
但后来我看到put
的{{1}}方法的代码。
为什么Hashmap
为key
?
它调用null
私有方法。它做了什么?
但我认为如果密钥为空则应该给出一些异常。
为什么他们没有像那样实现它? 如果键为空,键值对无效?
答案 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)
这是Hashtable
和HashMap
之间的差异之一。
Hashtable
不允许使用null键或值。 HashMap
允许一个空键和任意数量的空值。
通常,我们使用null键来表示默认情况(即,如果给定的密钥不存在,应该使用的值)
答案 2 :(得分:0)
HashMap只允许一个空键。因此,每当任何人想要使用null放置一些值时,它会在put方法中调用putForNullKey方法,而在putForNullKey方法中,它将值放在零索引处。
为了通过null键获取值,它还有一个方法getForNullKey,它从get方法内部调用。