繁体   English   中英

为什么Hashmap允许空键?

[英]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键,你总是可以“免费”传递一些元数据和你的实际数据。 请注意,所有新集合ConcurrentHashMapMap.of (在java-9中)等都禁止以空值开头。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM