【发布时间】:2015-12-20 15:59:22
【问题描述】:
为什么在Java中Hashmap中允许有一个空键,而在Hashtable中却不允许?
【问题讨论】:
-
该问题与this重复
-
Hashtable 较旧,而 HashMap 较新,因为它是在 1998 年添加的。当他们实现 HashMap 时,他们希望解除 Hashtable 的一些限制。
为什么在Java中Hashmap中允许有一个空键,而在Hashtable中却不允许?
【问题讨论】:
哈希表是非常古老的类,从 JDK 1.0 开始
要理解这一点,首先你需要理解作者在这个类上写的cmets。
这个类实现了一个哈希表,它将键映射到值。任何非空对象都可以用作键或值。要成功存储和检索哈希表中的对象,用作键的对象必须实现 hashCode 方法和 equals 方法。
HashTable 类是在散列机制上实现的,即存储任意键值对,其需要的键对象的散列码。如果 key 为 null,它将无法给出 hash,它将通过 null 指针异常和类似的情况,如果 value 为 null,则抛出 null。
但后来意识到空键和空值有其自身的重要性,这就是为什么在后来实现的类(如HashMap 类)中允许一个空键和多个空值。
对于哈希映射,空键将允许,如果键为空,则对键进行空检查,然后该元素将存储在 Entry 数组中的零位置。我们可以将 null 键用于一些默认值..
【讨论】:
HashMap 允许空键。如果您尝试插入相同键的另一个值,它将覆盖它。
在HashTable的情况下,如果key或value为null,put(K key, V value)会抛出Null指针异常。
【讨论】:
http://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html
如果您查看 HashMap 的文档
HashMap类大致相当于HashTable,除了它是不同步的并且允许null的。)
HashTable 是 HashMap 的旧版本,在处理 null 的情况下失败。而HashMap 添加了该功能,使其比HashTable 更先进。
【讨论】: