Map.of() vs. Collections.emptyMap()
2022-09-01 06:12:06
和 之间是否有区别,和 之间和 之间和 ?Map.of()
Collections.emptyMap()
List.of()
Collections.emptyList()
Set.of()
Collections.emptySet()
和 之间是否有区别,和 之间和 之间和 ?Map.of()
Collections.emptyMap()
List.of()
Collections.emptyList()
Set.of()
Collections.emptySet()
是的,类中的工厂方法返回的集合与 JDK 9 的接口 (, , ) 中引入的新工厂方法之间甚至存在行为差异,而不仅仅是技术差异,如果这些集合是在没有参数的情况下调用的。emptyXyz
Collections
of
Map
List
Set
相关的区别在于,新工厂方法返回的集合不允许键和值(如 LIST、Set 和 Map 接口中的 API 文档中所述)。对于空集合,这听起来可能无关紧要,但即使它没有非常清楚地记录,即使是新集合实现中的访问器方法也会检查 null 值。of
null
一些差异示例:
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 中实现的那样,至少在新工厂方法返回的集合上,以下方法将抛出 s,但使用类中的旧工厂方法,行为“理智”(如集合类最初设计和指定为支持空键和值的方式):NullPointerException
Collections
List.of().contains(null);
Set.of().contains(null);
Map.of().containsKey(null);
Map.of().containsValue(null);
Map.of().getOrDefault(null, <any>);