Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么哈希表不接受空键?_Java_Collections - Fatal编程技术网

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))