Map.of()
和Collections.emptyMap()
之间,List.of()
和Collections.emptyList()
之间以及Set.of()
和Collections.emptySet()
之间是否存在差异?
答案 0 :(得分:19)
是,emptyXyz
类中的Collections
工厂方法和新of
返回的集合之间甚至存在行为而非技术差异接口(Map
,List
,Set
)中引入的工厂方法与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>);