摘要:它不對(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之RegularEnumSet的高效之處> 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內(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
摘要:知識(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中...
摘要:當(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ǔ)集合中的元素,因此具有很好的存取和查找性能 ...
摘要:集合判斷兩個(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集合中,則添加操作...
摘要:說(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)行...
摘要:集合類主要負(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)度就...
閱讀 1183·2021-11-23 10:10
閱讀 1519·2021-09-30 09:47
閱讀 901·2021-09-27 14:02
閱讀 2978·2019-08-30 15:45
閱讀 3025·2019-08-30 14:11
閱讀 3619·2019-08-29 14:05
閱讀 1827·2019-08-29 13:51
閱讀 2210·2019-08-29 11:33