Map.of()与Collections.emptyMap()

时间:2017-09-25 12:10:24

标签: java collections java-9

Map.of()Collections.emptyMap()之间,List.of()Collections.emptyList()之间以及Set.of()Collections.emptySet()之间是否存在差异?

1 个答案:

答案 0 :(得分:19)

emptyXyz类中的Collections工厂方法和新of返回的集合之间甚至存在行为而非技术差异接口(MapListSet)中引入的工厂方法与JDK 9,如果这些方法没有参数调用。

相关区别在于,新of工厂方法返回的集合不允许使用null个键和值(如List中的API文档中所指出的,{{3} }和Set接口)。这对于空集合来说可能听起来不那么重要,但即使它没有很清楚地记录,即使新集合实现中的访问器方法也检查空值。

差异的一些例子:

Collections.emptyList().contains(null)将返回false,而List.of().contains(null)将返回NullPointerException

Collection.emptyMap().getOrDefault(null, V)将返回V,而Map.of().getOrDefault(null, V)则会返回NullPointerException

正如目前在Oracle的JDK 9中实现的那样,新工厂方法返回的集合中的至少以下方法将抛出NullPointerException,但是表现得很“理智”(就像最初设计的集合类一样)指定支持null键和值)使用Collections类中的旧工厂方法:

  • List.of().contains(null);
  • Set.of().contains(null);
  • Map.of().containsKey(null);
  • Map.of().containsValue(null);
  • Map.of().getOrDefault(null, <any>);