国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

java EnumSet源碼學習

Achilles / 2956人閱讀

摘要:它不對外提供構造函數,只能通過一系列靜態方法,如來獲取對象實例。當要添加元素或者刪除元素時,也只需要改變的值即可。后面可能會再研究如有不正確或者想交流的地方,歡迎指出

一、EnumSet 簡單介紹
1、A specialized Set implementation for use with enum types. 
2、All of the elements in an enum set must come from a single enum type 
     that is specified, explicitly or implicitly, when the set is created.
EnumSet是Set的一種實現,它必須要配合枚舉使用,并且EnumSet內部的元素只能是一種類型
二、EnumSet的內部設計思路

EnumSet是一個抽象類,內部多處采用靜態工廠方法。它不對外提供構造函數,只能通過一系列靜態方法,如of(...)、noneOf(...)、copyOf(...)、complementOf(...)來獲取對象實例。這樣做的好處是它對外封裝了內部實現,如EnumSet返回的真正的類型是它的子類:RegularEnumSet或者JumboEnumSet,但外部使用者并不知道這些,當EnumSet API升級時,如添加一個子類實現,原先引用的地方不用發生改變。

//核心方法,其他獲取EnumSet實例的方法都調用了這個方法
public static > EnumSet noneOf(Class elementType) {
        Enum[] universe = getUniverse(elementType);
        if (universe == null)
            throw new ClassCastException(elementType + " not an enum");

        if (universe.length <= 64)
            return new RegularEnumSet<>(elementType, universe);
        else
            return new JumboEnumSet<>(elementType, universe);
}
三、EnumSet之RegularEnumSet的高效之處

首先,在EnumSet內部,有一個成員變量final Enum[] universe;,它持有該EnumSet中的元素所對應的枚舉類型的所有值(實例),當調用noneOf()方法時,都會調用getUniverse()獲取到枚舉類型的所有實例,并賦值給universe變量。然后在RegularEnumSet子類中,有一個成員變量private long elements,可以根據elements的值進行位運算得到的結果,到universe數組取得相應的元素。當要添加元素或者刪除元素時,也只需要改變elements的值即可。

   /**
     * Returns all of the values comprising E.
     * The result is uncloned, cached, and shared by all callers.
     */
    private static > E[] getUniverse(Class elementType) {
        return SharedSecrets.getJavaLangAccess()
                                        .getEnumConstantsShared(elementType);
    }
   /**
     * Returns true if this set contains the specified element.
     */
    public boolean contains(Object e) {
        if (e == null)
            return false;
        Class eClass = e.getClass();
        if (eClass != elementType && eClass.getSuperclass() != elementType)
            return false;

        return (elements & (1L << ((Enum)e).ordinal())) != 0;
    }

   /**
     * Adds the specified element to this set if it is not already present.
     */
    public boolean add(E e) {
        typeCheck(e);

        long oldElements = elements;
        elements |= (1L << ((Enum)e).ordinal());
        return elements != oldElements;
    }

1、JumboEnumSet后面可能會再研究
2、如有不正確或者想交流的地方,歡迎指出

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68575.html

相關文章

  • Java知識點總結(Java容器-EnumSet

    摘要:知識點總結容器知識點總結容器是一個專為枚舉設計的集合類,中所有值都必須是指定枚舉類型的枚舉值,該枚舉類型在創建時顯式或隱性的指定。集合不容許加入元素。 Java知識點總結(Java容器-EnumSet) @(Java知識點總結)[Java, Java容器, JavaCollection, JavaSet] EnumSet EnumSet是一個專為枚舉設計的集合類 ,EnumSet中...

    kycool 評論0 收藏0
  • Java 集合 Set

    摘要:當復制集合中的所有元素來創建新的集合時,要求集合中的所有元素必須是同一個枚舉類的枚舉值各實現類的性能分析的性能總比好,特別是最常用的添加查詢元素等操作。因為需要額外的紅黑樹算法來維護集合元素的次序。在創建時進行,以防對集合的意外非同步訪問 HashSet 大多時候使用Set集合時就是使用HashSet實現類。HashSet按Hash算法來存儲集合中的元素,因此具有很好的存取和查找性能 ...

    verano 評論0 收藏0
  • java集合-Set

    摘要:集合判斷兩個元素的標準是兩個對象通過方法比較相等,并且兩個對象的方法返回值也相等。的集合元素也是有序的,以枚舉值在類內的定義順序來決定集合元素的順序。是所有實現類中性能最好的,但它只能保存同一個枚舉類的枚舉值作為集合元素。 Set集合通常不能記住元素的添加順序。Set不允許包含重復的元素。 Set集合不允許包含相同的元素,如果試圖把兩個相同的元素加入同一個Set集合中,則添加操作...

    xavier 評論0 收藏0
  • Java 基礎 | Collection 集合概覽

    摘要:說到復盤基礎,并不是所有的都會復盤,沒那個時間更沒那個必要。比如,一些基礎的語法以及條件語句,極度簡單。思前想后,我覺得整個計劃應該從集合開始,而復盤的方式就是讀源碼。通常,隊列不允許隨機訪問隊列中的元素。 ?showImg(https://segmentfault.com/img/remote/1460000020029737?w=1080&h=711); 老讀者都知道,我是自學轉行...

    codergarden 評論0 收藏0
  • java學習(七) —— API集合類

    摘要:集合類主要負責保存盛裝其他數據,因此集合類也被稱為容器類。所有的集合類都位于包下。表示一組對象,這些對象也稱為的元素。成員方法把集合轉成數組迭代器,集合的專用遍歷方式之接口概述有序的,也稱為序列。 前言 在編程中,常常需要集中存放多個數據。從傳統意義上講,數組是我們的一個很好的選擇,前提是我們實現已經明確知道我們將要保存的對象的數量。 一旦在數組初始化時指定了數組長度,這個數組長度就...

    senntyou 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<