【问题标题】:Java Collections HashTable and HashMapJava 集合 HashTable 和 HashMap
【发布时间】:2015-12-20 15:59:22
【问题描述】:

为什么在JavaHashmap中允许有一个空键,而在Hashtable中却不允许?

【问题讨论】:

  • 该问题与this重复
  • Hashtable 较旧,而 HashMap 较新,因为它是在 1998 年添加的。当他们实现 HashMap 时,他们希望解除 Hashtable 的一些限制。

标签: java hashmap hashtable


【解决方案1】:

哈希表是非常古老的类,从 JDK 1.0 开始

要理解这一点,首先你需要理解作者在这个类上写的cmets。

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

HashTable 类是在散列机制上实现的,即存储任意键值对,其需要的键对象的散列码。如果 key 为 null,它将无法给出 hash,它将通过 null 指针异常和类似的情况,如果 value 为 null,则抛出 null。

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

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

【讨论】:

    【解决方案2】:

    HashMap 允许空键。如果您尝试插入相同键的另一个值,它将覆盖它。

    在HashTable的情况下,如果key或value为null,put(K key, V value)会抛出Null指针异常。

    参考源代码。 哈希映射: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

    【讨论】:

      【解决方案3】:

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

      如果您查看 HashMap 的文档

      HashMap 类大致相当于HashTable,除了它是不同步的并且允许null 的。)

      HashTableHashMap 的旧版本,在处理 null 的情况下失败。而HashMap 添加了该功能,使其比HashTable 更先进。

      【讨论】:

        猜你喜欢
        • 2010-11-15
        • 2018-05-30
        • 1970-01-01
        • 2018-02-17
        • 2020-10-11
        • 2012-02-11
        • 1970-01-01
        • 1970-01-01
        • 2016-07-18
        相关资源
        最近更新 更多