Collections.emptyList()与新的实例

在实践中,最好是返回一个像这样的空列表:

return Collections.emptyList(); 

或者像这样 :

 return new ArrayList<Foo>(); 

或者这是完全依赖于你将要做什么与返回列表?

主要区别在于Collections.emptyList()返回一个不可变列表,即不能添加元素的列表。

在极less数情况下,您确实想修改返回的列表,因此这不是一个选项。

我想说,只要合同(文档)没有明确地指出不同的地方,那么返回一个不可变列表是完全正确的(甚至是首选方法)。


另外, emptyList() 可能不会为每个调用创build一个新的对象。

此方法的实现不需要为每个调用创build一个单独的List对象。 使用这种方法可能会有类似的使用类似名称的字段的成本。 (与此方法不同,该字段不提供types安全性。)

emptyList的实现如下所示:

 public static final <T> List<T> emptyList() { return (List<T>) EMPTY_LIST; } 

所以如果你的方法(返回一个空的列表)经常被调用,这种方法甚至可以给你更好的CPU和内存的性能。

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

 Collections.<Foo>emptyList() 

我同意其他的回应,如果你想返回一个空列表,你应该使用这种方法。

Collections.emptyList是不可变的,所以两个版本之间有区别,所以你必须考虑返回值的用户。

返回new ArrayList<Foo>总是创build一个新的对象实例,所以它有一个非常轻微的额外的成本相关,这可能会给你一个理由使用Collections.emptyList 。 我喜欢使用emptyList ,因为它更具可读性。

尽pipe谨慎。 如果你将返回Collections.emptyList() ,然后尝试像add()或者那样做一些修改,你将有一个UnsupportedOperationException()因为Collections.emptyList()返回一个不可变的对象。

如果返回的列表没有以任何方式被修改(因为列表是不可变的),我会去与Collections.emptyList() ,否则我会select2。

Collections.emptyList()的好处是每次都返回相同的静态实例,所以每个调用都不会创build实例。

使用Collections.emptyList()如果你想确保返回的列表永远不会被修改。 这是调用emptyList()时返回的内容:

 /** * The empty list (immutable). */ public static final List EMPTY_LIST = new EmptyList(); 

给出的答案强调emptyList()返回一个不可变List的事实,但不给出替代。 构造函数ArrayList(int initialCapacity)特殊情况下0返回new ArrayList<>(0)而不是new ArrayList<>()也可能是一个可行的解决scheme:

 /** * 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)