![](/img/trans.png)
[英]Why does changing the hashcode of an object used as a key in a HashMap make a lookup return null?
[英]Why does Hashmap allow a null key?
实际上我读了很多关于这个问题的帖子,但没有得到“ 为什么Hashmap允许空键? ”的确切原因/答案。 请问一个人能给我一个例子的确切答案吗?
您对问题的一种解释:
为什么hashmap允许[只]一个空键?
问问自己:如果HashMap允许多个null
键,地图对象如何区分它们?
提示:只有一个null
值。
您问题的替代解释
为什么hashmap允许[a] null键?
因为它在某些情况下很有用,并且因为没有真正的语义需要不允许它1,2 。
相比之下,使用TreeMap
不允许使用null
键,因为考虑到涉及null
的排序的含义,支持它们会很困难。
Comparable
的指定语义是抛出NPE。 Comparator
器订购null
,但不是必需的。 许多常见的实现都没有。 因此,如果TreeMap
允许null
,则地图的行为可能会有所不同,具体取决于是使用Comparator
还是Comparable
。 凌乱。
1 - 至少,这是他们在1998年在Java 1.2中指定HashMap
时的观点。从那时起,一些设计师可能已经改变了主意,但由于行为明确指定 ,因此在不破坏兼容性的情况下无法更改。 它不会发生......
2 - 对null
键的支持需要HashMap
一些特殊情况代码,这至少增加了实现的复杂性。 目前尚不清楚它是否是HashMap
的性能开销,因为即使不允许使用null
键,仍然需要对null
键进行隐式测试。 这很可能是噪音。
Java工程师必须意识到拥有null键和值有其用途,比如将它们用于默认情况。 因此,他们在Java 5中为HashMap类提供了具有存储空键和值的能力的集合框架。
在HashMap中插入键值对的put方法检查null键并将其存储在内部表数组的第一个位置。 它不怕空值,也不像Hashtable那样抛出NullPointerException。
现在,只能有一个空键,因为键必须是唯一的,尽管我们可以有多个与不同键相关联的空值。
这个链接可以回答更多hashmap null key的解释
HashMap.put的javadoc明确指出:
将指定的值与此映射中的指定键相关联。 如果映射先前包含键的映射,则替换旧值。
它清楚地说明当您使用已经在地图中的键进行放置时会发生什么。 key == null的特定情况以相同的方式运行:对于null键,您不能有两个不同的映射(就像您不能为任何其他键一样)。
这仍然被视为在HashMap
早期实现中所犯的错误 ,不幸的是人们在哪里(依赖?)依赖(以及某些特定的顺序,直到java-8)。 问题是,拥有这个null
键,你总是可以“免费”传递一些元数据和你的实际数据。 请注意,所有新集合ConcurrentHashMap
, Map.of
(在java-9中)等都禁止以空值开头。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.