为什么Hashmap允许空键?

时间:2017-12-11 05:57:42

标签: java collections hashmap

实际上我读了很多关于这个问题的帖子,但没有得到“为什么Hashmap允许空键?”的确切原因/答案。请问有人可以给我一个确切的答案吗?

4 个答案:

答案 0 :(得分:9)

对您的问题的一种解释:

  

为什么hashmap允许[只]一个空键?

问问自己:如果HashMap允许多个null密钥,地图对象如何区分它们?

提示:只有一个null值。

您问题的替代解释

  

为什么hashmap允许[a] null键?

因为它在某些情况下很有用,并且因为没有真正的语义需要禁止它 1,2

相比之下,TreeMap null密钥是不允许的,因为考虑到涉及null的排序含义,支持它们会很困难。

  • 鉴于Comparable的指定语义是抛出NPE。
  • Comparator 允许订购null,但不是必需的。许多常见的实现都没有。

因此,如果null允许TreeMap,那么地图的行为可能会有所不同,具体取决于是使用了Comparator还是Comparable。凌乱。

1 - 至少,这是他们在1998年在Java 1.2中指定HashMap的视图。从那时起,一些设计师可能已经改变了主意,但是因为行为是明确指定在不破坏兼容性的情况下无法更改。它不会发生......

2 - 对null密钥的支持需要HashMap中的一些特殊情况代码,这至少会增加实现的复杂性。目前尚不清楚它是HashMap的性能开销,因为即使null密钥不被允许,仍需要对null密钥进行隐式测试。这很可能在噪音中下降。

答案 1 :(得分:1)

Java工程师必须意识到拥有null键和值的用途就像将它们用于默认情况一样。因此,他们在Java 5中为HashMap类提供了集合框架,具有存储空键和值的能力。

在HashMap中插入键值对的put方法检查null键并将其存储在内部表数组的第一个位置。它不怕空值,也不像Hashtable那样抛出NullPointerException。

现在,只能有一个空键,因为键必须是唯一的,尽管我们可以有多个与不同键相关联的空值。

此链接可以回答更多hashmap null key explained

答案 2 :(得分:0)

HashMap.put的javadoc明确指出:

  

将指定的值与此映射中的指定键相关联。如果地图以前包含该键的映射,则替换旧值。

它清楚地说明当您使用已经在地图中的键进行放置时会发生什么。 key == null的具体情况表现相同:你不能为null键设置两个不同的映射(就像你可以为任何其他键一样)。

答案 3 :(得分:0)

HashMap的早期实现中,这仍然被视为错误,不幸的是人们在哪里(依赖?)依赖(以及某些特定的顺序,直到java-8)。问题是,使用此null密钥,您可以随时传递一些元数据以及实际数据"免费"。请注意,所有新集合ConcurrentHashMapMap.of(在java-9中)等都禁止以空值开头。

相关问题