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和内存方面提供稍微更好的性能.
Pau*_*son 50
从Java 5.0开始,您可以指定容器中元素的类型:
Collections.<Foo>emptyList()
Run Code Online (Sandbox Code Playgroud)
我同意其他回复,对于你想要返回一个空的空列表的情况,你应该使用这种方法.
Jef*_*ter 27
Collections.emptyList 是不可变的,因此两个版本之间存在差异,因此您必须考虑返回值的用户.
返回new ArrayList<Foo>总是创建一个对象的新实例,因此它有一个非常小的额外成本,它可能会给你一个使用的理由Collections.emptyList.我喜欢使用emptyList只是因为它更具可读性.
Ser*_*lov 13
但要小心.如果你返回Collections.emptyList()然后尝试用它做类似的改变,add()或者像那样做,你会有一个UnsupportedOperationException()因为Collections.emptyList()返回一个不可变对象.
我会去Collections.emptyList(),如果返回的列表中没有被以任何方式修改(如列表是不可改变的),否则我会选择去2.
好处Collections.emptyList()是每次都返回相同的静态实例,因此每次调用都不会发生实例创建.