繁体   English   中英

为什么Hashtable不带空键?

[英]Why does Hashtable not take null key?

为什么Hashtable不采用null键?

为什么HashMap允许null键?

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

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.

简而言之,由于null不是对象,因此不能在其上调用.equals().hashCode() ,因此Hashtable无法计算哈希值以将其用作键。

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

具体来说,在发出.get(key)时,使用null作为键是这样处理的:

(key==null ? k==null : key.equals(k))

这只是一个实现细节。

Hashtable是较旧的类,通常不鼓励使用它。 也许他们看到需要一个null键,更重要的是 - null值,并将其添加到HashMap实现中。

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

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

应该弃用Hashtable,恕我直言。

我会让你知道hashmap如何在内部存储对象:

HashMap通过put(key,value)存储值,并获取值get(key) 该过程遵循Hashing的概念。

当我们说put(key,value) - 计算密钥的内部hashCode()并将其作为hashfunction()的输入来查找存储的存储区位置。

在碰撞的情况下 - 在计算hashcode() ,可能存在密钥不同但hashcode()相同的可能性,此时在找到存储桶位置之后,存储在链表中完成。 请注意 - 存储为Map.Entry时,存储键值。

当通过key检索值时,如果在碰撞期间密钥的hashcode()可能相同,则通过equals()函数重新获取该值以找出所需的密钥的值。

问候,阿南德

除了在其他答案中给出的所有细节之外,这是hashmap允许NULL键的方式。 如果查看Hashmap(JDK 5)中的方法putForNullKey() ,它会为null键保留索引“0”。 null键的所有值都保存在数组的“0”索引中。

存储NULL值没有什么特别之处,因为所有put和lookup操作都基于Key对象工作。

在散列表中,Java没有这些机制,因此散列表不支持NULL键或值。

它们是两个不同的类,分为两个不同的东西。 此外,HashTable是同步的。 HashTable也出现在HashMap之前,所以很自然它会不那么先进。 在早期的Java中生成空哈希码可能没有意义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM