poitroae
poitroae

Reputation: 21367

What is the difference between Collections.emptyList() and Collections.EMPTY_LIST

In Java, we have Collections.emptyList() and Collections.EMPTY_LIST. Both have the same property:

Returns the empty list (immutable). This list is serializable.

So what is the exact difference between using the one or the other?

Upvotes: 122

Views: 39526

Answers (4)

poitroae
poitroae

Reputation: 21367

  • Collections.EMPTY_LIST returns an old-style List
  • Collections.emptyList() uses type-inference and therefore returns List<T>

Collections.emptyList() was added in Java 1.5 and it is probably always preferable. This way, you don't need to unnecessarily cast around within your code.

Collections.emptyList() intrinsically does the cast for you.

@SuppressWarnings("unchecked")
public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}

Upvotes: 154

mel3kings
mel3kings

Reputation: 9405

In other words, EMPTY_LIST is not type safe:

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

As compared to:

    List<String> s = Collections.emptyList();
    Set<Long> l = Collections.emptySet();
    Map<Date, String> d = Collections.emptyMap();

Upvotes: 14

NimChimpsky
NimChimpsky

Reputation: 47280

Lets get to the source :

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

and

@SuppressWarnings("unchecked")
public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}

Upvotes: 21

Andremoniy
Andremoniy

Reputation: 34900

They are absolutely equal objects.

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

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

The only one is that emptyList() returns generic List<T>, so you can assign this list to generic collection without any warnings.

Upvotes: 14

Related Questions