实际上我读了很多关于这个问题的帖子,但没有得到“为什么Hashmap允许空键?”的确切原因/答案。请问有人可以给我一个确切的答案吗?
答案 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
密钥,您可以随时传递一些元数据以及实际数据"免费"。请注意,所有新集合ConcurrentHashMap
,Map.of
(在java-9中)等都禁止以空值开头。