Map.of() vs. Collections.emptyMap()

2022-09-01 06:12:06

和 之间是否有区别,和 之间和 之间和 ?Map.of()Collections.emptyMap()List.of()Collections.emptyList()Set.of()Collections.emptySet()


答案 1

是的,类中的工厂方法返回的集合与 JDK 9 的接口 (, , ) 中引入的新工厂方法之间甚至存在行为差异,而不仅仅是技术差异,如果这些集合是在没有参数的情况下调用的。emptyXyzCollectionsofMapListSet

相关的区别在于,新工厂方法返回的集合不允许键和值(如 LISTSetMap 接口中的 API 文档中所述)。对于空集合,这听起来可能无关紧要,但即使它没有非常清楚地记录,即使是新集合实现中的访问器方法也会检查 null 值。ofnull

一些差异示例:

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

Collection.emptyMap().getOrDefault(null, V)将返回,而将抛出一个 .VMap.of().getOrDefault(null, V)NullPointerException

正如目前在 Oracle 的 JDK 9 中实现的那样,至少在新工厂方法返回的集合上,以下方法将抛出 s,但使用类中的旧工厂方法,行为“理智”(如集合类最初设计和指定为支持空键和值的方式):NullPointerExceptionCollections

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

答案 2