先說明一下好處有哪些:
1,如果你想 new 一個空的 List ,而這個 List 以后也不會再添加元素,那么就用 Collections.emptyList() 好了。
new ArrayList() 或者 new LinkedList() 在創建的時候有會有初始大小,多少會占用一內存。
每次使用都new 一個空的list集合,浪費就積少成多,浪費就嚴重啦,就不好啦
2,為了編碼的方便。
比如說一個方法返回類型是List,當沒有任何結果的時候,返回null,有結果的時候,返回list集合列表。
那樣的話,調用這個方法的地方,就需要進行null判斷。使用emptyList這樣的方法,可以方便方法調用者。返回的就不會是null,省去重復代碼。
注意的地方:
這個空的集合是不能調用.add(),添加元素的。因為直接報異常。因為源碼就是這么寫的:直接拋異常。
哦,Collections里面沒這么寫,但是EmptyList繼承了AbstractList這個抽象類,里面簡單實現了部分集合框架的方法。
這里面的add方法最后調用的方法體,就是直接拋異常。
throw new UnsupportedOperationException();
這么解釋add報異常就對啦。
下面簡單看下這個源碼:
- /**
- * Collections 類里面的方法如下,一步步往下看就是啦
- */
- public static final <T> List<T> emptyList() {
- return (List<T>) EMPTY_LIST;
- }
- //。。。。。
- /**
- * Collections 類里面的方法如下,一步步往下看就是啦
- */
- public static final List EMPTY_LIST = new EmptyList<>();
- //。。。。。
- /**
- * Collections里面的一個靜態內部類
- */
- private static class EmptyList<E> extends AbstractList<E> implements RandomAccess, Serializable {
- private static final long serialVersionUID = 8842843931221139166L;
- public Iterator<E> iterator() {
- return emptyIterator();
- }
- public ListIterator<E> listIterator() {
- return emptyListIterator();
- }
- public int size() {return 0;}
- public boolean isEmpty() {return true;}
- public boolean contains(Object obj) {return false;}
- public boolean containsAll(Collection<?> c) { return c.isEmpty(); }
- public Object[] toArray() { return new Object[0]; }
- public <T> T[] toArray(T[] a) {
- if (a.length > 0)
- a[0] = null;
- return a;
- }
- public E get(int index) {
- throw new IndexOutOfBoundsException("Index: "+index);
- }
- public boolean equals(Object o) {
- return (o instanceof List) && ((List<?>)o).isEmpty();
- }
- public int hashCode() { return 1; }
- // Preserves singleton property
- private Object readResolve() {
- return EMPTY_LIST;
- }
- }
除了這個emptyList,之外,還有類似的,emptyMap,emptySet等等。具體看下圖,都是一個套路。