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?
Solution 1:
-
Collections.EMPTY_LIST
returns an old-styleList
-
Collections.emptyList()
uses type-inference and therefore returnsList<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;
}
Solution 2:
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;
}
Solution 3:
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();
Solution 4:
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.