我试图了解使用以下方法创建列表的新实例之间的区别:
new ArrayList<X>
和
Collections.emptyList();
据我了解,后者返回一个不可变列表。这意味着无法添加、删除或修改它。我想知道为什么要创建和不可变的 emptyList ?有什么用?谢谢
我试图了解使用以下方法创建列表的新实例之间的区别:
new ArrayList<X>
和
Collections.emptyList();
据我了解,后者返回一个不可变列表。这意味着无法添加、删除或修改它。我想知道为什么要创建和不可变的 emptyList ?有什么用?谢谢
不可变允许可重用实例。
Collections.emptyList 将始终返回完全相同的单例实例。
这是非常有效的。
除此之外,不可变数据可以在线程之间安全地共享,并保证避免由于编码错误导致的奇怪副作用。出于这个原因,它也使防御性副本变得不必要。
假设您必须返回一个集合,并且您不想每次都创建几个对象。
interface Configurable {
List<String> getConfigurationList();
}
// class which doesn't have any configuration
class SimpleConfigurable implements Configurable {
public List<String> getConfigurationList() { return Collections.emptyList(); }
}
返回一个空集合通常比返回更可取null
我经常使用空列表作为Null 对象:这避免了检查null
。
我已经使用Collections.emptyList
了返回列表但使用没有意义的参数调用的方法。
例如,您想要访问流的不同部分的流处理应用程序,可能基于日期。您从流中查询项目的时间跨度,但如果在该时间跨度内没有项目,您将返回一个空列表。抛出异常没有任何意义,因为查询没有任何问题。返回null
也没有多大意义,因为所有调用代码都需要检查null
.
返回一个不可变的空列表允许调用代码很好地处理返回值,您无需担心线程问题,因为不可变列表本质上是线程安全的。
避免不需要的 NullPointerException。
在您的代码中,您可能会返回一个普通的“空”ArrayList 而不是返回 null。但是,这样一来,您将在每次执行时继续创建新对象(默认容量为 10),这不是一种内存高效的方法。相反,如果您返回 emptyList,则每次调用都将返回相同的实例。这样,它以更有效的方式将您从不需要的 NullPointerException 中拯救出来。以下是 emptyList 的 Javadoc 的片段:
/**
* Returns the empty list (immutable). This list is serializable.
*
* <p>This example illustrates the type-safe way to obtain an empty list:
* <pre>
* List<String> s = Collections.emptyList();
* </pre>
* Implementation note: Implementations of this method need not
* create a separate <tt>List</tt> object for each call. Using this
* method is likely to have comparable cost to using the like-named
* field. (Unlike this method, the field does not provide type safety.)
*
* @see #EMPTY_LIST
* @since 1.5
*/