为什么在哈希映射中使用空值或空键很有用?

2022-09-01 10:21:35

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

问题:

  1. 为什么会这样?
  2. 在HashMap中拥有这样的键和值有什么用?

答案 1

1. 为什么会这样?

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

我只能猜测设计师在想什么,但这是我的猜测:

  • Hashtable 通过在每个密钥上调用 hashCode 来计算每个密钥的哈希值。如果密钥为 null,这将失败,因此这可能是不允许 null 作为密钥的原因。
  • 如果密钥不存在,则方法 Hashtable.get 返回 null。如果 null 是有效值,则对于 null 是否意味着密钥存在但值为 null,或者密钥是否不存在,将不明确。歧义是不好的,所以这可能是不允许 null 作为值的原因。

然而,事实证明,有时你确实想存储空值,所以在HashMap中删除了限制。HashMap.get 的文档中还包含以下警告:

返回值 null 并不一定表示映射不包含键的映射;映射也有可能将键显式映射到 null。


2. 在HashMap中拥有这样的键和值有什么用?

显式存储 null 以区分已知存在但没有关联值的键和不存在的键非常有用。例如,注册用户及其生日的列表。如果您要求特定用户的生日,您希望能够区分该用户不存在和现有但尚未输入其生日的用户。

我想不出任何(好的)理由想要将null存储为密钥,一般来说,我建议不要使用null作为密钥,但大概至少有一个人在某个地方需要该密钥可以是null。


答案 2

好吧,我认为Mark Byers回答得很完美,所以只是一个简单的例子,其中空值和键可能很有用:

假设您有一个昂贵的函数,它始终为相同的输入返回相同的结果。地图是缓存其结果的简单方法。也许有时该函数会返回null,但无论如何您都需要保存它,因为执行成本很高。因此,必须存储空值。如果 null 键是函数的可接受输入,则这同样适用。