当前位置: 首页 > 知识库问答 >
问题:

为什么Map.of不允许空键和值?

微生昌胤
2023-03-14

在Java9中,为listsetmap接口引入了新的工厂方法。这些方法允许在一行中快速实例化具有值的Map对象。现在,如果我们考虑:

Map<Integer, String> map1 = new HashMap<Integer, String>(Map.of(1, "value1", 2, "value2", 3, "value3"));
map1.put(4, null);

以上内容是允许的,没有任何例外,如果我们这样做:

Map<Integer, String> map2 = Map.of(1, "value1", 2, "value2", 3, "value3", 4, null );
Exception in thread "main" java.lang.NullPointerException
    at java.base/java.util.Objects.requireNonNull(Objects.java:221)
..

我知道HashMap可以将null作为键和值,但为什么在Map.of的情况下会受到限制呢?

同样的情况也发生在java.util.set.of(“v1”,“v2”,null)java.util.list.of(“v1”,“v2”,null)中。

共有1个答案

寇和璧
2023-03-14

正如其他人指出的,map协定允许拒绝空值...

许多实现禁止null键和值[...]。尝试插入不合格的键或值会引发未经检查的异常,通常为NullPointerExceptionClassCastException

...收集工厂(不仅仅是地图上的)利用了这一点。

您可以听Stuart Marks在本讲座中解释它,但JEP269(介绍了工厂方法)也总结了它:

将不允许空元素、键和值。(最近引入的集合都不支持NULL。)此外,禁止空值为更紧凑的内部表示、更快的访问和更少的特殊情况提供了机会。

由于HashMap在慢慢发现时已经出现了,所以在不破坏现有代码的情况下更改它已经为时已晚,但是这些接口的最新实现(例如ConcurrentHashMap)不再允许Null,工厂方法的新集合也不例外。

因此,不允许null有一些技术原因,但这样做也是为了使用创建的集合提高代码的健壮性。

 类似资料:
  • 问题内容: 如JDK文档中所指定,Hashtable不允许空键或值。HashMap允许一个null键和任意数量的null值。为什么是这样? 问题答案: Hashtable是较老的类,通常不鼓励使用Hashtable。也许他们看到了对null键的需求,更重要的是对null值的需求,并将其添加到HashMap实现中。 HashMap是较新的,并且具有更高级的功能,这些基本上只是对Hashtable功能

  • 我正在阅读jls§5.1.7,它说有9种拳击类型,第9种是拳击 然后我读到的拆箱转换会抛出一个。好的,这很明显。那么为什么的装箱不会抛出一个以及装箱值有什么用呢?

  • 问题内容: W3指定表列(带有元素)仅允许使用四个CSS规则- 边框,背景,宽度和可见性。 有人知道这个决定的原因吗?如果可以使用边框和背景,为什么不使用字体和颜色呢? 问题答案: IanHixie在这里详细解释:为什么只有四个属性应用于表列的奥秘。相关报价: 文本的颜色取决于其元素的“颜色”属性。除非指定,否则“ color”属性(基本上)默认为“ inherit”,这意味着“采用父元素的值”。

  • 问题内容: 我读了这个问题,并认为如果可以写的话,很容易解决(不是没有它就不能解决): 我不确定在很多情况下它是否有用,但是我想知道为什么它没有用,以及其他语言中是否存在类似的东西。 你们有什么感想? 编辑: 澄清一下:是的,我知道,这在Java中是不可能的,我也不是很想念它。这不是我期望的工作,并且惊讶于出现编译器错误。我只是有这个主意,喜欢讨论它。 问题答案: 它违反了封装。你不应该能够绕过父

  • 其中map类型为,但我的测试在编译时失败: 为什么JUnit(或Hamcrest)不能确定使用哪个匹配器?

  • 问题内容: 除了JSONP,为什么要遵循相同的域策略? 问题答案: 出于安全原因,已实施“同源起源策略”;引用维基百科的相关句子: 这种机制对现代Web应用程序具有特殊的意义,因为Web服务器广泛依赖于HTTP cookie来维护经过身份验证的用户会话,因为服务器基于HTTP cookie信息进行操作以揭示敏感信息或执行状态更改操作。 必须在客户端维护不相关站点提供的内容之间的严格分隔,以防止丢失