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)