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

資訊專欄INFORMATION COLUMN

java EnumSet源碼學(xué)習(xí)

Achilles / 2962人閱讀

摘要:它不對(duì)外提供構(gòu)造函數(shù),只能通過(guò)一系列靜態(tài)方法,如來(lái)獲取對(duì)象實(shí)例。當(dāng)要添加元素或者刪除元素時(shí),也只需要改變的值即可。后面可能會(huì)再研究如有不正確或者想交流的地方,歡迎指出

一、EnumSet 簡(jiǎn)單介紹
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的一種實(shí)現(xiàn),它必須要配合枚舉使用,并且EnumSet內(nèi)部的元素只能是一種類型
二、EnumSet的內(nèi)部設(shè)計(jì)思路

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

//核心方法,其他獲取EnumSet實(shí)例的方法都調(diào)用了這個(gè)方法
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內(nèi)部,有一個(gè)成員變量final Enum[] universe;,它持有該EnumSet中的元素所對(duì)應(yīng)的枚舉類型的所有值(實(shí)例),當(dāng)調(diào)用noneOf()方法時(shí),都會(huì)調(diào)用getUniverse()獲取到枚舉類型的所有實(shí)例,并賦值給universe變量。然后在RegularEnumSet子類中,有一個(gè)成員變量private long elements,可以根據(jù)elements的值進(jìn)行位運(yùn)算得到的結(jié)果,到universe數(shù)組取得相應(yīng)的元素。當(dāng)要添加元素或者刪除元素時(shí),也只需要改變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后面可能會(huì)再研究
2、如有不正確或者想交流的地方,歡迎指出

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/68575.html

相關(guān)文章

  • Java知識(shí)點(diǎn)總結(jié)(Java容器-EnumSet

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

    kycool 評(píng)論0 收藏0
  • Java 集合 Set

    摘要:當(dāng)復(fù)制集合中的所有元素來(lái)創(chuàng)建新的集合時(shí),要求集合中的所有元素必須是同一個(gè)枚舉類的枚舉值各實(shí)現(xiàn)類的性能分析的性能總比好,特別是最常用的添加查詢?cè)氐炔僮鳌R驗(yàn)樾枰~外的紅黑樹(shù)算法來(lái)維護(hù)集合元素的次序。在創(chuàng)建時(shí)進(jìn)行,以防對(duì)集合的意外非同步訪問(wèn) HashSet 大多時(shí)候使用Set集合時(shí)就是使用HashSet實(shí)現(xiàn)類。HashSet按Hash算法來(lái)存儲(chǔ)集合中的元素,因此具有很好的存取和查找性能 ...

    verano 評(píng)論0 收藏0
  • java集合-Set

    摘要:集合判斷兩個(gè)元素的標(biāo)準(zhǔn)是兩個(gè)對(duì)象通過(guò)方法比較相等,并且兩個(gè)對(duì)象的方法返回值也相等。的集合元素也是有序的,以枚舉值在類內(nèi)的定義順序來(lái)決定集合元素的順序。是所有實(shí)現(xiàn)類中性能最好的,但它只能保存同一個(gè)枚舉類的枚舉值作為集合元素。 Set集合通常不能記住元素的添加順序。Set不允許包含重復(fù)的元素。 Set集合不允許包含相同的元素,如果試圖把兩個(gè)相同的元素加入同一個(gè)Set集合中,則添加操作...

    xavier 評(píng)論0 收藏0
  • Java 基礎(chǔ) | Collection 集合概覽

    摘要:說(shuō)到復(fù)盤(pán)基礎(chǔ),并不是所有的都會(huì)復(fù)盤(pán),沒(méi)那個(gè)時(shí)間更沒(méi)那個(gè)必要。比如,一些基礎(chǔ)的語(yǔ)法以及條件語(yǔ)句,極度簡(jiǎn)單。思前想后,我覺(jué)得整個(gè)計(jì)劃應(yīng)該從集合開(kāi)始,而復(fù)盤(pán)的方式就是讀源碼。通常,隊(duì)列不允許隨機(jī)訪問(wèn)隊(duì)列中的元素。 ?showImg(https://segmentfault.com/img/remote/1460000020029737?w=1080&h=711); 老讀者都知道,我是自學(xué)轉(zhuǎn)行...

    codergarden 評(píng)論0 收藏0
  • java學(xué)習(xí)(七) —— API集合類

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

    senntyou 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<