Collections.emptyMap()vs new HashMap()

问题

有什么情况可以使用Collections.emptyMap()?文档说如果我希望我的集合是不可变的,我可以使用这种方法。
为什么我要一个不可变的空集合?有什么意义?


#1 热门回答(128 赞)

FromEffective Java,Item#43-"Return empty arrays or collections, not null"demonstrates返回一个空集合,甚至可能演示使用Collections类上的这些533324700,emptySet()emptyMap()方法来获得一个空集合,它还具有不可变的额外好处。 FromItem#15"Minimize Mutability"

FromCollections-emptySet-Collections-emptyList-Collections

它是一种编程习语。这适用于不想要空变量的人。因此,在初始化集合之前,他们可以使用空集。

**注意:**下面的代码只是一个例子(根据你的使用情况改变它):

private Set myset = Collections.emptySet();

void initSet() {
   myset = new HashSet();
}
void deleteSet() {
   myset = Collections.emptySet();
}

这些方法提供了几个优点:

  • 它们更简洁,因为你不需要显式地键入集合的泛型类型 - 它通常只是从方法调用的上下文中推断出来。
  • 它们更有效率,因为它们不会打扰创建新对象;他们只是重用现有的空和不可变对象。这种效果通常很小,但偶尔(很少,很少)很重要。

#2 热门回答(31 赞)

根据我的个人经验,在API需要参数集合的情况下非常有用,但你无需提供任何参数。例如,你可能有一个看起来像这样的API,并且不允许空引用:

public ResultSet executeQuery(String query, Map<String, Object> queryParameters);

如果你有一个不带任何参数的查询,创建一个HashMap肯定有点浪费,它涉及分配一个数组,当你可以传入实际上是常量的'Empty Map'时,它的实现方式injava.util.Collections


#3 热门回答(19 赞)

为什么我想要一个不可变的空集合?有什么意义?

这里有两个不同的概念,一起看时看起来很奇怪。当你分别对待这两个概念时,它会更有意义。

  • 首先,你应该尽可能使用不可变集合而不是可变集合。其他地方都有很好的文献记载。
  • 其次,你应该更喜欢使用空集合而不是使用null作为哨兵。这里有很好的描述。这意味着你将拥有更清晰,更易于理解的代码,并且可以减少隐藏错误的位置。

因此,当你拥有需要 Map 的代码时,最好传递一个空 Map 而不是空来表示没有 Map 。大多数情况下,当你使用 Map 时,最好使用不可变 Map 。所以这就是为什么有一个便利函数来制作一个不可变的空映射。