为什么Hashtable不带空键?

BOS*_*OSS 14 java collections

为什么Hashtable不拿钥匙null

为什么HashMap允许null键?

使这两个类的目的是什么?Key行为如此不同?

cde*_*zaq 29

来自Hashtable JavaDoc:

To successfully store and retrieve objects from a hashtable, the objects used 
as keys must implement the hashCode method and the equals method.
Run Code Online (Sandbox Code Playgroud)

简而言之,因为null它不是一个对象,所以你不能调用它.equals()或者.hashCode()它,因此Hashtable无法计算哈希值来将它用作键.

HashMap更新,并具有更高级的功能,这基本上只是对Hashtable功能的改进.因此,在HashMap创建时,它专门设计为将null值作为键处理并将其作为特殊情况处理.

具体来说,null在发出以下内容时,像这样处理密钥的使用.get(key):

(key==null ? k==null : key.equals(k))
Run Code Online (Sandbox Code Playgroud)


Boz*_*zho 5

这只是一个实现细节.

Hashtable是较老的阶级,一般不鼓励使用它.也许他们认为需要一个null键,更重要的是 - null值,并在HashMap实现中添加它.


JB *_*zet 5

Hashtable早于集合框架,是JDK 1.0的一部分.那时,空键可能被认为是无用的或不是必需的,因此被禁止.您可能会将其视为设计错误,就像选择名称Hashtable而不是HashTable.

然后,几年后,收集框架,Hashtable稍作修改,以适应框架.但是没有更改null键上的行为以保持向后兼容性.

应该弃用Hashtable,恕我直言.