Map.keySet什么时候返回null?

3

我正在阅读一些代码,它检查由Map.keySet返回的值是否为null。Javadoc没有提及Map.keySet的返回值。如果Map不包含任何内容,则返回一个空集合。

Map.keySet的返回值什么情况下会是null呢?


6
它不应返回null。 - Eran
1
我相信文档应该会说,如果……它将“返回null”,因此您可以放心使用Java提供的实现。当然,您也可以定义自己的Map来打破这一点。 - AxelH
我猜测在代码中大量使用空值检查是因为“十亿美元错误”的后遗症,即允许所有引用为null(而不是将可选性嵌入类型系统并由编译器强制执行)。宁愿安全也不要抱有可能发生的空指针异常的侥幸心理... - Thilo
你使用的 Map 实现是哪个?是来自 JDK 还是第三方库? - Andrew Tobilko
正在进行检查的地图是一个LinkedHashMap。 - saga
@saga,那个检查是多余的,你可以将其删除,地图视图可以为空,但永远不会是“null”。 - Andrew Tobilko
2个回答

8

你所提到的代码作者明显对Map.keySet方法并不理解。正如你所提到的,Java文档中明确没有说明keySet方法会返回null

HashMap的实现为例,keySet方法的定义如下:

public Set<K> keySet() {
      Set<K> ks = keySet;
      if (ks == null) {
          ks = new KeySet();
          keySet = ks;
      }
      return ks;
}

因此,正如您所看到的,该方法返回的值永远不会为空。

我还检查了其他一些实现keySet方法的代码,例如TreeMap, ConcurrentHashMap等,但没有发现任何一个会返回null的。


3

Map.keySet 绝不能返回 null。文档中暗示了 keySet 不应为 null,因为它的内容“跟随” Map 的内容:

这个 set 是由 map 支持的,所以 map 的更改会反映在 set 中,反之亦然。

如果允许 keySet 返回 null,则这将是不可能实现的。

Java 中的标准实现 HashMapTreeMap 不会从 keySet 返回 null。由于 Map 是一个接口,因此可以开发一个错误的实现来返回 null 以代替 keySet。尽管如此,为这种遥远的可能性编程并不是一个好主意。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接