Java 为什么哈希表不接受空键?
为什么哈希表不接受Java 为什么哈希表不接受空键?,java,collections,Java,Collections,为什么哈希表不接受null键 还有,为什么HashMap允许null键 使这两个类的键行为如此不同的目的是什么?这只是一个实现细节 Hashtable是较旧的类,通常不鼓励使用它。也许他们看到了空键的需要,更重要的是空值,并将其添加到HashMap实现中 简而言之,由于null不是对象,因此不能对其调用.equals()或.hashCode(),因此哈希表无法计算哈希值以将其用作键 更新了,并且具有更高级的功能,这基本上只是对哈希表功能的改进。因此,当创建HashMap时,它被专门设计为将nul
null
键
还有,为什么HashMap允许null
键
使这两个类的键行为如此不同的目的是什么?这只是一个实现细节
Hashtable
是较旧的类,通常不鼓励使用它。也许他们看到了空键的需要,更重要的是空值,并将其添加到HashMap
实现中
简而言之,由于null
不是对象,因此不能对其调用.equals()
或.hashCode()
,因此哈希表
无法计算哈希值以将其用作键
更新了,并且具有更高级的功能,这基本上只是对哈希表
功能的改进。因此,当创建HashMap
时,它被专门设计为将null
值作为键处理,并将其作为特例处理
具体来说,在发出.get(key)
时,将null
用作键的处理方式如下:
Hashtable早于collections框架,是JDK1.0的一部分。在那个时候,空键可能被认为是无用或不必要的,因此被禁止使用。您可能会将其视为设计错误,就像选择名称
Hashtable
而不是Hashtable
一样
然后,几年后,出现了collections框架,Hashtable被稍微修改以适应该框架。但是null键上的行为没有改变以保持向后兼容性
Hashtable应该被弃用,IMHO。它们是用于两种不同事物的两个独立类。此外,哈希表是同步的。HashTable也出现在HashMap之前,所以它自然就不那么高级了。在早期Java中生成空哈希代码可能没有意义。除了在其他答案中给出的所有细节之外,这就是hashmap允许空键的方式。如果查看Hashmap(JDK 5)中的方法
putForNullKey()
,它会为null键保留索引“0”。null键的所有值都保存在数组的“0”索引中
存储NULL值没有什么特别的,因为所有的put和lookup操作都是基于Key对象的
在hashtable中,Java没有这些机制,因此hashtable不支持空键或值。我将告诉您hashmap如何在内部存储对象: HashMap通过put(key,value)存储值,并通过
get(key)
获取值。该过程遵循哈希的概念
当我们说put(key,value)
-内部hashCode()
时,会计算密钥,并将其作为hashfunction()
的输入,以查找存储的存储桶位置
在发生冲突的情况下-在计算hashcode()
时,可能键不同,但hashcode()
相同,此时在找到存储桶位置后,存储在链表中。请注意-当存储为映射时,两个键值都被存储
当通过键检索值时,如果在冲突期间键的hashcode()可能相同,则通过equals()
函数检索值,以查找所需键的值
问候,,
Anand好吧,这可能会回答您的问题:如果您查看
AbstractMap
,您会发现空键是经过特殊处理的。如果将空键包装到对象(NullKey
)中并对其进行特殊处理,则可以在Hashtable
中使用空键。我不确定在类的外部接口中处理null
值是否是一个实现细节,但我同意这可能是HashTable
的设计疏忽,在HashMap
中得到了纠正。Map
接口没有说明null
值,因此每个实现都可以选择:)并发HashMap是一个较新的类,但它不允许null键HashMap不是HashTable的包装器。它是一个独立的实现。@EJP-我没有说它实际上是一个围绕哈希表
的包装器,而是说它包装了相同的功能,因为它做了哈希表
所做的事情以及更多的事情。所以当你说“包装”时,你不是指“包装”。你的意思可能是“实现”或“提供”。@EJP-是的,你是对的。“wrap”这个词用起来不好。我更新了我的答案,以更好地反映我的意思和现实。简而言之,“key的hashcode是使用hashtable中key的hashcode(key class hashcode)和hashmap中hashmap的hashcode计算的”
To successfully store and retrieve objects from a hashtable, the objects used
as keys must implement the hashCode method and the equals method.
(key==null ? k==null : key.equals(k))