Java 为什么在散列映射中使用空值或空键很有用?

Java 为什么在散列映射中使用空值或空键很有用?,java,hashmap,Java,Hashmap,Hashtable不允许空键或值,而HashMap允许空值和1个空键 问题: 为什么会这样 在HashMap中有这样一个键和值有什么用处 一,。为什么会这样 HashMap比Hashtable更新,并修复了它的一些限制 我只能猜测设计师的想法,但以下是我的猜测: Hashtable通过调用每个键来计算每个键的哈希值。如果密钥为null,则此操作将失败,因此这可能是不允许将null作为密钥的原因 如果键不存在,则该方法返回null。如果null是一个有效值,那么null是否意味着键存在但值为nu

Hashtable
不允许空键或值,而
HashMap
允许空值和1个空键

问题:
  • 为什么会这样
  • 在HashMap中有这样一个键和值有什么用处
  • 一,。为什么会这样

    HashMap比Hashtable更新,并修复了它的一些限制

    我只能猜测设计师的想法,但以下是我的猜测:

    • Hashtable通过调用每个键来计算每个键的哈希值。如果密钥为null,则此操作将失败,因此这可能是不允许将null作为密钥的原因
    • 如果键不存在,则该方法返回null。如果null是一个有效值,那么null是否意味着键存在但值为null,或者键不存在,这将是不明确的。模糊性是不好的,所以这可能是不允许空值作为值的一个原因
    然而,事实证明,有时您确实希望存储空值,因此在HashMap中删除了限制。文件中还包括以下警告:

    返回值null不一定表示映射不包含键的映射;映射也可能将密钥显式映射为null


    二,。在HashMap中有这样一个键和值有什么用处

    显式存储null有助于区分已知存在但没有关联值的键和不存在的键。例如,注册用户及其生日的列表。如果您询问某个特定用户的生日,您希望能够区分该用户不存在和该用户存在但尚未输入其生日


    我想不出任何(好的)理由想要将null存储为键,一般来说,我建议不要使用null作为键,但可能至少有一个人需要可以为null的键。

    好吧,我认为Mark Byers回答得很好,所以举个简单的例子,null值和键可能很有用:


    假设您有一个昂贵的函数,它总是为相同的输入返回相同的结果。映射是缓存其结果的简单方法。有时函数可能会返回null,但无论如何都需要保存它,因为执行代价很高。因此,必须存储空值。如果null键是函数的可接受输入,则同样适用于null键。

    除了Mark Bayers的回答之外,, Null被视为数据,必须将其存储为值以供进一步检查。在许多情况下,可以使用null as值来检查是否存在键条目,但没有为其分配值,因此可以采取相应的操作。这可以通过首先检查键是否存在,然后获取值来实现。 还有一种情况是,只需输入任何数据(无需任何检查)。所有的检查都会在得到它之后应用于它


    虽然null是一个键,但我认为可以用来定义一些默认数据。通常,作为一个键使用null没有多大意义。

    Sir HashMap也在内部使用hashCode()方法在HashMap中插入一个元素,因此我认为这不是“为什么HashTable允许null键”的正确原因。

    这将使Map接口更易于使用/不太冗长
    null
    是引用类型的合法值。使映射能够处理空键和值将消除在调用api之前进行空检查的需要。因此,MapAPI在运行时创建的“惊喜”更少

    例如,通常使用map对基于单个字段的同质对象集合进行分类。当map与null兼容时,代码将更加简洁,因为它只是一个没有if语句的简单循环(当然,您需要确保集合中没有null元素)。没有分支/异常处理的代码行越少,逻辑上越正确


    另一方面,不允许null不会使map接口更好/更安全/更易于使用。依靠映射拒绝空值是不实际的——这意味着将抛出异常,您必须捕获并处理它。或者,为了消除异常,在调用map方法之前,您必须确保没有任何内容为null——在这种情况下,您不在乎map是否接受null,因为您已经过滤了输入。

    HashTable是一个非常古老的类,从JDK 1.0开始。从JDK 1.0开始的类称为Legacy类,默认情况下,它们是同步的

    要理解这一点,首先您需要理解作者在这个类上写的注释。 此类实现了一个哈希表,它将键映射到值。任何非null对象都可以用作键或值。要成功地从哈希表存储和检索对象,用作键的对象必须实现hashCode方法和equals方法

    哈希表类是在哈希机制上实现的,意思是存储任何键值对,它所需的密钥对象的哈希代码。HashTable通过对每个键调用hashCode来计算每个键的哈希值。如果键为null,则此操作将失败,它将无法为null键提供哈希,它将抛出NullPointerException,值的情况类似,如果值为null,则抛出null

    但后来人们意识到空键和值有其自身的重要性,于是引入了HashTable的改进实现,如HashMap,它允许一个空键和多个空值

    对于HashMap,它允许一个null键,并且对键进行null检查,如果该键为null,那么该元素将存储在Entry数组中的零位置

    HashMap中不能有多个Null键,因为键是唯一的,因此只允许一个Null键和多个Null值

    使用-N