在实践中,最好是返回this之类的空列表:
return Collections.emptyList();
或者像this:
return new ArrayList<Foo>();
或者这完全取决于你要对返回的列表做什么?
答案 0 :(得分:267)
主要区别在于Collections.emptyList()
返回不可变列表,即您无法添加元素的列表。 (同样适用于Java 9中引入的List.of()
。)
在您做想要修改返回列表的极少数情况下,Collections.emptyList()
和List.of()
因此 是一个不错的选择。< / p>
我要说只要合同(文档)没有明确说明不同,返回一个不可变列表就完全没问题了(甚至是首选的方式)。
此外,emptyList()
might not create a new object with each call.
此方法的实现无需为每个调用创建单独的List对象。使用此方法可能具有与使用类似命名字段相当的成本。 (与此方法不同,该字段不提供类型安全性。)
emptyList
的实施如下:
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
因此,如果您的方法(返回空列表)经常被调用,这种方法甚至可以在CPU和内存方面为您提供稍微更好的性能。
答案 1 :(得分:46)
从Java 5.0开始,您可以指定容器中元素的类型:
Collections.<Foo>emptyList()
我同意其他回复,对于你想要返回一个空的空列表的情况,你应该使用这种方法。
答案 2 :(得分:25)
Collections.emptyList
是不可变的,因此两个版本之间存在差异,因此您必须考虑返回值的用户。
返回new ArrayList<Foo>
总是会创建一个新的对象实例,因此它会有一个非常轻微的额外成本,这可能会让您有理由使用Collections.emptyList
。我喜欢使用emptyList
,因为它更具可读性。
答案 3 :(得分:11)
小心谨慎。如果您返回Collections.emptyList()
,然后尝试对其进行一些更改,例如add()
或类似的事件,那么您将拥有UnsupportedOperationException()
,因为Collections.emptyList()
会返回一个不可变对象。
答案 4 :(得分:6)
如果返回的列表没有以任何方式被修改(因为列表是不可变的),我会使用Collections.emptyList()
,否则我会使用选项2。
Collections.emptyList()
的好处是每次都返回相同的静态实例,因此每次调用都不会创建实例。
答案 5 :(得分:2)
如果要确保永远不会修改返回的列表,请使用Collections.emptyList()。这是调用emptyList()时返回的内容:
/**
* The empty list (immutable).
*/
public static final List EMPTY_LIST = new EmptyList();
答案 6 :(得分:1)
给出的答案强调emptyList()
返回不可变List
但不提供替代的事实。构造函数ArrayList(int initialCapacity)
特殊情况0
因此返回new ArrayList<>(0)
而不是new ArrayList<>()
也可能是一个可行的解决方案:
/**
* Shared empty array instance used for empty instances.
*/
private static final Object[] EMPTY_ELEMENTDATA = {};
[...]
/**
* Constructs an empty list with the specified initial capacity.
*
* @param initialCapacity the initial capacity of the list
* @throws IllegalArgumentException if the specified initial capacity
* is negative
*/
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
(来自Java 1.8.0_72的资料)