当前位置: 首页 > 面试题库 >

Collections.emptyList()与新实例

韦晟睿
2023-03-14
问题内容

在实践中,是能够更好地返回一个空列表像这样:

return Collections.emptyList();

或者像这样:

return new ArrayList<Foo>();

还是这完全取决于您要对返回的列表执行什么操作?


问题答案:

主要区别是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;
}

因此,如果经常调用您的方法(返回一个空列表),则此方法甚至可以在CPU和内存方面为您提供更好的性能



 类似资料:
  • 问题内容: 作为一个特例List.of(…)或Collections.unmodifiableList() -什么是指向一个的首选的Java 9路 空 和 不可变 列表? 继续写 或切换到 问题答案: Java 9指向空且不可变列表的首选方式是什么? 差异相当细微,因此“首选”取决于您要实现的目标。一些行为上的差异: 如果调用由于某种奇怪的原因而发生,将引发异常。 您可以反序列化JDK 8及更高版

  • 问题内容: 如果我在某个类中有一个很少使用的集合,该集合可能被实例化很多次,则有时我可能会求助于以下“习惯用法”以节省不必要的对象创建: 现在,我想知道是否无法使用来消除这些空检查,但是我将不得不像这样更改if检查: 除了每次都分配一个新的空集合以外,还有更好的方法来处理此问题吗? 编辑: 为了清楚起见,我 想 使用Collections.emptyList(),但是在add()中进行上述检查确实

  • 问题内容: 在Java中,我们具有Collections.emptyList()和Collections.EMPTY_LIST。两者具有相同的属性: 返回空列表(不可变)。该列表是可序列化的。 那么使用一个或另一个之间的确切区别是什么? 问题答案: 返回旧样式 使用类型推断,因此返回 在Java 1.5中添加了Collections.emptyList(),它可能始终是首选 。这样,您无需在代码中

  • 问题内容: 您能否解释一下为什么使用第一个返回类型无法编译代码?消息是:。 在第二种情况下是否插入了显式强制转换? 问题答案: 由于类型推断规则。我不知道为什么要 这么做 (您应该检查JSL 的三元运算符部分),但是看来三元表达式不能从返回类型推断出类型参数。 换句话说,三元表达式的类型取决于其操作数的类型。但是其中一个操作数的类型参数()不确定。那时三元表达式仍然没有类型,因此它不会影响类型参数

  • 问题内容: 我试图了解使用以下命令创建列表的新实例之间的区别: 和 据我了解,稍后将返回一个不可变的列表。这意味着无法添加,删除或修改它。我想知道为什么会创建一个不可变的emptyList?有什么用?谢谢 问题答案: 假设您必须返回一个集合,并且您不想每次都创建几个对象。 返回空集合通常比返回更可取

  • 问题内容: 如果将新文档索引到Elasticsearch索引,则可在索引操作后1秒钟左右搜索新文档。但是,可以通过调用或对索引进行操作来强制使该文档可立即搜索。这两个操作之间有什么区别- 结果似乎对他们来说是相同的,可以立即搜索文档。 这些操作中的每一项到底是什么? ES文档似乎并未深入解决此问题。 问题答案: 您得到的答案是正确的,但我认为值得详细说明。 刷新有效地调用了Lucene索引读取器上