【问题标题】:Why Hashtable not allowed null value? [duplicate]为什么 Hashtable 不允许空值? [复制]
【发布时间】:2019-01-21 08:14:51
【问题描述】:

我知道 Hashtable 中不允许使用 null 键,因为在 Hashtable 中存储元素必须需要哈希码。但如果 key 为 null,它将无法计算 null key 的哈希码。但我不明白 Sun 开发人员不允许空值的确切原因是什么。

有人说在 put 方法实现中对 value 进行了 null 检查,这就是它抛出 NullPointerException 的原因。但我的问题是为什么要检查空值。有没有什么具体的原因。

我读了很多书,但没有得到满意的答案。有人说如果有 null 值存在歧义,如果您尝试使用 get() 方法检索值,它将返回 null,而这个 null 是因为实际值为 null 或缺少键,这就是为什么 null 并且无法预测原因。所以我需要有证据的精确答案。

【问题讨论】:

  • 读取put方法的实现。下载JDK并浏览代码
  • 我认为您的问题在this StackOverflow 帖子中描述得很好
  • 我认为您应该让 SUN 开发人员知道“确切的原因”是什么……尤其是在您需要证据的情况下!

标签: java


【解决方案1】:

如果你这样做,你将获得 NULL 的价值

hashtable.get("key")

并且“key”不在地图中,那么您不需要存储空值。

如果您能够存储 null,您将永远不会知道您拥有什么:null 映射 或者那是 缺少映射 em>

【讨论】:

  • 每一次投反对票都会得到评论。
  • 我没有投反对票,但也认为这不是正确答案,因为HashMap 允许值为 null
  • 没关系,你从HashtableHashMap 获得价值的方式是一样的,在一个班级可以做到,在第二个班级你不能。所以你的论点是不正确的。我同意你不需要存储空值,但我不是 NPE 的论据。
  • 也许你能告诉我们什么是 OP 的论据?我提出了一个你不需要的理由。它与 SUN 开发人员无关。如果有人能够解释我,为什么这不是答案,我将不胜感激。
  • @Simion 您投了反对票(不是我投的票),因为您确实没有回答这个问题。即使按照您所说的那样,拥有可能为空的键和值仍然是一个错误的决定。 Map.of java-9 中的静态方法证明了
【解决方案2】:

Hashtable 被视为遗留代码。你应该使用HashMap,它允许null作为值,并且一个键可以是null

编辑

经过更深入的搜索,我可能会对这样的决定提出异议。 Hashtable 是同步的(而 HashMap 不是)。

来自JavaDoc

与新的集合实现不同,Hashtable 是同步的。如果不需要线程安全实现,建议使用HashMap 代替Hashtable。如果需要线程安全的高并发实现,建议使用ConcurrentHashMap 代替Hashtable

如您所见,Hashtable 的继任者不是我之前写的HashMap,而是ConcurrentHashMap。我很惊讶ConcurrentHashMap 不允许 允许 null。我开始挖掘,发现this

From the author of ConcurrentHashMap himself (Doug Lea):

ConcurrentMaps (ConcurrentHashMaps, ConcurrentSkipListMaps) 中不允许使用空值的主要原因是无法容纳在非并发映射中几乎无法容忍的歧义。主要是如果map.get(key)返回null,则无法检测到键是否显式映射到null,而键未映射。在非并发映射中,您可以通过map.contains(key) 进行检查,但在并发映射中,映射可能在调用之间发生了变化。

所以Hashtable 的作者可能与ConcurrentHashMap 的作者有相同的原因

【讨论】:

    【解决方案3】:

    空值仍然HashMap 中被认为是一个错误的决定,而新的Map 类和java-9 中的静态工厂方法证明:

    Map.of("test", null)
    

    会抛出一个NulPointerException

    【讨论】:

      【解决方案4】:

      From Java Documentation

      为了成功地从哈希表中存储和检索对象, 用作键的对象必须实现 hashCode 方法和 equals 方法

      Null 不是对象,因此不能对其调用 .equals() 或 .hashCode(),因此 Hashtable 无法计算哈希以将其用作键

      Hashtable containsValue(Object value) 函数如果值为null则抛出NullPointerException,因此对于该值也不允许为null

      【讨论】:

      • 问题是关于值,而不是键。该问题已经提到了您在此处陈述的事实。
      猜你喜欢
      • 2012-08-12
      • 2012-01-16
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      • 2018-07-19
      • 1970-01-01
      相关资源
      最近更新 更多