113

在 Java 中,我们有Collections.emptyList()Collections.EMPTY_LIST。两者具有相同的属性:

返回空列表(不可变)。这个列表是可序列化的。

那么使用其中一个或另一个之间的确切区别是什么?

4

4 回答 4

143
  • Collections.EMPTY_LIST返回旧式List
  • Collections.emptyList()使用类型推断,因此返回 List<T>

Collections.emptyList() 是在 Java 1.5 中添加的,它可能总是更可取的。这样,您无需在代码中进行不必要的转换。

Collections.emptyList()本质上为你做演员。

@SuppressWarnings("unchecked")
public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}
于 2013-02-14T08:44:52.207 回答
18

让我们找到源头:

 public static final List EMPTY_LIST = new EmptyList<>();

@SuppressWarnings("unchecked")
public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}
于 2013-02-14T08:45:59.843 回答
14

换句话说,EMPTY_LIST 不是类型安全的:

  List list = Collections.EMPTY_LIST;
  Set set = Collections.EMPTY_SET;
  Map map = Collections.EMPTY_MAP;

相比于:

    List<String> s = Collections.emptyList();
    Set<Long> l = Collections.emptySet();
    Map<Date, String> d = Collections.emptyMap();
于 2013-03-01T07:08:09.937 回答
13

它们是绝对相等的对象。

public static final List EMPTY_LIST = new EmptyList<>();

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

唯一的一个是emptyList()返回 generic List<T>,因此您可以将此列表分配给通用集合而不会发出任何警告。

于 2013-02-14T08:45:29.660 回答