Java Collections HashTable and HashMap



为什么在Java中,Hashmap允许一个空键,而在Hashtable的情况下,则不允许?

http://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html

如果您查看HashMap 的文档

HashMap类大致等同于HashTable,只是它不同步并且允许null。(

HashTableHashMap的旧版本,在处理null的情况下失败。并且HashMap将该特性添加到其中,以获得比HashTable更先进的性能。

HashMap允许空键。若您尝试插入同一密钥的另一个值,它将覆盖它。

在HashTable的情况下,如果键或值为Null,put(K键,V值(将抛出Null指针Exception。

请参阅源代码。哈希映射:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/util/HashMap.java#HashMap.put%28java.lang.Object%2Cjava.lang.Object%29

哈希表:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Hashtable.java#Hashtable.put%28java.lang.Object%2Cjava.lang.Object%29

哈希表是一个非常古老的类,来自JDK 1.0

要理解这一点,首先你需要理解作者在这节课上写的评论。

这个类实现了一个哈希表,它将键映射到值。任何非null对象都可以用作键或值。要成功存储和检索哈希表中的对象,用作键的对象必须实现hashCode方法和equals方法。

HashTable类是在哈希机制上实现的,即存储任何键值对,它所需的密钥对象的哈希代码。如果键为null,它将无法给出哈希,它将通过null指针异常和类似的情况,如果值为null,则抛出null。

但后来人们意识到,空键和空值有其自身的重要性,这就是为什么在后来实现的类(如HashMap类(中允许一个空键和多个空值。

对于哈希映射,将允许空键,并且对键进行空检查。如果键为空,则该元素将存储在Entry数组中的零位置。null键,我们可以将其用于某些默认值。。

最新更新