Collections.emptyList()与新实例

mre*_*mre 234 java collections empty-list

在实践中,是能够更好地返回像一个空列表:

return Collections.emptyList();
Run Code Online (Sandbox Code Playgroud)

或者像这样:

return new ArrayList<Foo>();
Run Code Online (Sandbox Code Playgroud)

或者这完全取决于你要对返回的列表做什么?

aio*_*obe 288

主要区别在于Collections.emptyList()返回不可变列表,即无法添加元素的列表.(同样适用List.of()于Java 9中引入的.)

在极少数情况下,您需要修改返回的列表,Collections.emptyList()List.of()因此不是一个好的选择.

我要说只要合同(文档)没有明确说明不同,返回一个不可变列表就完全没问题了(甚至是首选的方式).


此外,emptyList() 可能无法在每次调用时创建新对象.

此方法的实现不需要为每个调用创建单独的List对象.使用此方法可能具有与使用类似命名字段相当的成本.(与此方法不同,该字段不提供类型安全性.)

执行情况emptyList如下:

public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}
Run Code Online (Sandbox Code Playgroud)

因此,如果您的方法(返回空列表)经常被调用,这种方法甚至可以在CPU和内存方面提供稍微更好的性能.

  • 那么,`Collections.emptyList()`更适合让我们说,错误检查等吗? (4认同)
  • @AJW,是的。但是,与“ new ArrayList &lt;&gt;()”相比,它还使设计决策更加清晰;元素将不会添加到此列表中。 (4认同)
  • 是的,我会这么说. (3认同)

Pau*_*son 50

从Java 5.0开始,您可以指定容器中元素的类型:

Collections.<Foo>emptyList()
Run Code Online (Sandbox Code Playgroud)

我同意其他回复,对于你想要返回一个空的空列表的情况,你应该使用这种方法.

  • 从Java 7开始,您可以让编译器从目标类型推断泛型方法调用的类型参数:`List <Foo> list = Collections.emptyList()` (35认同)

Jef*_*ter 27

Collections.emptyList 是不可变的,因此两个版本之间存在差异,因此您必须考虑返回值的用户.

返回new ArrayList<Foo>总是创建一个对象的新实例,因此它有一个非常小的额外成本,它可能会给你一个使用的理由Collections.emptyList.我喜欢使用emptyList只是因为它更具可读性.


Ser*_*lov 13

但要小心.如果你返回Collections.emptyList()然后尝试用它做类似的改变,add()或者像那样做,你会有一个UnsupportedOperationException()因为Collections.emptyList()返回一个不可变对象.


S73*_*17H 7

我会去Collections.emptyList(),如果返回的列表中没有被以任何方式修改(如列表是不可改变的),否则我会选择去2.

好处Collections.emptyList()是每次都返回相同的静态实例,因此每次调用都不会发生实例创建.