91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java Collections的emptyList和EMPTY_LIST怎么用

發布時間:2021-11-16 17:21:18 來源:億速云 閱讀:214 作者:小新 欄目:開發技術

這篇文章主要介紹Java Collections的emptyList和EMPTY_LIST怎么用,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

Collections的emptyList、EMPTY_LIST使用

在看大佬寫的代碼的時候,結果集為空的情況,他返回的不是null,而是:

return Collections.EMPTY_LIST;

我們都知道返回null,很有可能造成空指針異常,可以使用emptyList或EMPTY_LIST就可以避免這個問題,除非你想捕獲這個為空的信息

我們在使用emptyList空的方法返回空集合的時候要注意,這個空集合是不可變的。

空的集合不可以使用add方法,會報UnsupportedOperationException異常,看如下源碼:

public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }

空集合對象不可以使用put方法,會報IndexOutOfBoundsException異常,看如下源碼:

 public E get(int index) {
            throw new IndexOutOfBoundsException("Index: "+index);
        }

但是對于for循環都不會發生異常,如下的示例:

 List<String> list1 = Collections.emptyList();
        for(String s:list1) {
        }
        for(int i=0;i<list1.size();i++) {
        }

上面的兩種for循環都可以正常的執行,第一種foreach循環,實際編譯之后會變成迭代器的模式,這樣我們就好理解為什么可以正常執行;第二種是只調用了size方法,我們可以看到源碼直接返回0;

public int size() {return 0;}

emptyList和EMPTY_LIST的區別,我們看下源碼:

/**
     * The empty list (immutable).  This list is serializable.
     *
     * @see #emptyList()
     */
    @SuppressWarnings("unchecked")
    public static final List EMPTY_LIST = new EmptyList<>();
/**
     * Returns the empty list (immutable).  This list is serializable.
     *
     * <p>This example illustrates the type-safe way to obtain an empty list:
     * <pre>
     *     List&lt;String&gt; s = Collections.emptyList();
     * </pre>
     * Implementation note:  Implementations of this method need not
     * create a separate <tt>List</tt> object for each call.   Using this
     * method is likely to have comparable cost to using the like-named
     * field.  (Unlike this method, the field does not provide type safety.)
     *
     * @see #EMPTY_LIST
     * @since 1.5
     */
    @SuppressWarnings("unchecked")
    public static final <T> List<T> emptyList() {
        return (List<T>) EMPTY_LIST;
    }

我們看到EMPTY_LIST 是Collections類的一個靜態常量,而emptyList是支持泛型的。若是不需要泛型的地方可以直接使用 EMPTY_LIST ,若是需要泛型的地方就需要使用emptyList。

通過上面的分析我們可以很清楚的知道什么時候使用emptyList;Collections集合中還有其它的幾種空集合emptyMap、emptySet,他們的使用方法跟上面的大同小異。

Collections.emptyList()使用注意

偶然發現有小伙伴錯誤地使用了Collections.emptyList()方法,這里記錄一下。它的使用方式是:

public void run() {
    ......
    List list = buildList(param);
    ......
    Object newNode = getNode(...);
    list.add(newNode);
    ......
}
 
public List buildList(Object param) {
    if (isInValid(param)) {
        return Collections.emptyList();
    } else {
        ......
    }
}

buildList方法中可能會返回一個"空的List",后續還可能往這個List添加元素(或者移除元素),但是沒有注意Collections.emptyList方法返回的是一個EMPTY_LIST:

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

它是一個static final修飾的成員變量,是一個EmptyList類的實例:

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

這個EmptyList是一個靜態內部類,和ArrayList一樣繼承自AbstractList:

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;
        }
    }

可以看到這個EmptList沒有重寫add方法,并且get方法也是直接拋出一個IndexOutOfBoundsException異常。既然沒有重寫add方法,那么看看父類AbstractList中的add方法:

public boolean add(E e) {
    add(size(), e);
    return true;
}
 
public void add(int index, E element) {
    throw new UnsupportedOperationException();
}

可以看到直接拋出的UnsupportedOperationException異常。再回到EmptyList類中,它對外提供的一些方法也很明顯地限制了它的使用范圍。

對于Collections.emptyList(),或者說Collections.EMPTY_LIST,最好只把它當做一個空列表的標識(可以想象成一個frozen過的空List),不要對其做一些增刪改查的操作。如果程序中的一些分支邏輯返回了這種實例,測試的時候又沒有覆蓋到,在生產環境如果走到了這個分支邏輯,那就麻煩了~

以上是“Java Collections的emptyList和EMPTY_LIST怎么用”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泸定县| 尼玛县| 和田市| 陈巴尔虎旗| 阿拉善右旗| 汽车| 武定县| 渝中区| 炎陵县| 平顺县| 从江县| 张北县| 大丰市| 中方县| 县级市| 门源| 慈利县| 清涧县| 襄汾县| 十堰市| 安宁市| 喜德县| 云安县| 南丰县| 凤阳县| 万荣县| 宜良县| 建始县| 南乐县| 尚义县| 名山县| 临猗县| 电白县| 板桥市| 宝山区| 贵南县| 南城县| 凤凰县| 精河县| 乐清市| 德兴市|