Java之Collections.emptyList()、emptySet()、emptyMap()的作用和好處以及要注意的地方


先說明一下好處有哪些:
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報異常就對啦。

 

下面簡單看下這個源碼:

 

[java]  view plain  copy
 
  1.    /** 
  2.     * Collections 類里面的方法如下,一步步往下看就是啦 
  3.     */  
  4.    public static final <T> List<T> emptyList() {  
  5.        return (List<T>) EMPTY_LIST;  
  6.    }  
  7. //。。。。。  
  8.    /** 
  9.     * Collections 類里面的方法如下,一步步往下看就是啦 
  10.     */  
  11.    public static final List EMPTY_LIST = new EmptyList<>();  
  12. //。。。。。  
  13.  /** 
  14.     * Collections里面的一個靜態內部類 
  15.     */  
  16.    private static class EmptyList<E> extends AbstractList<E> implements RandomAccess, Serializable {  
  17.        private static final long serialVersionUID = 8842843931221139166L;  
  18.   
  19.        public Iterator<E> iterator() {  
  20.            return emptyIterator();  
  21.        }  
  22.        public ListIterator<E> listIterator() {  
  23.            return emptyListIterator();  
  24.        }  
  25.   
  26.        public int size() {return 0;}  
  27.        public boolean isEmpty() {return true;}  
  28.   
  29.        public boolean contains(Object obj) {return false;}  
  30.        public boolean containsAll(Collection<?> c) { return c.isEmpty(); }  
  31.   
  32.        public Object[] toArray() { return new Object[0]; }  
  33.   
  34.        public <T> T[] toArray(T[] a) {  
  35.            if (a.length > 0)  
  36.                a[0] = null;  
  37.            return a;  
  38.        }  
  39.   
  40.        public E get(int index) {  
  41.            throw new IndexOutOfBoundsException("Index: "+index);  
  42.        }  
  43.   
  44.        public boolean equals(Object o) {  
  45.            return (o instanceof List) && ((List<?>)o).isEmpty();  
  46.        }  
  47.   
  48.        public int hashCode() { return 1; }  
  49.   
  50.        // Preserves singleton property  
  51.        private Object readResolve() {  
  52.            return EMPTY_LIST;  
  53.        }  
  54.    }  

 

除了這個emptyList,之外,還有類似的,emptyMap,emptySet等等。具體看下圖,都是一個套路。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM