1.定義:
特別なコレクションの列挙型クラス要素を追加します。
2.他のコレクションとの違い:
内部EnumSetの実装の基本的な動作は、そのようなアレイのような一般的なデータ構造(ArrayListに)、リスト(LinkedListの)HA系テーブル(ハッシュマップ、ハッシュテーブル、HashSetの)、赤黒木(のTreeMap、TreeSetの)しかしのビットのセットを使用して操作の完了を使用しません
EnumSetのは、以下のような方法のみ、EnumSetのオブジェクト静的工場によって構築することができる、抽象クラスです。
EnumSetの<E> noneOf(クラス< E>をelementType): 構築空集合
EnumSetの<E> ALLOF(クラス< E>をelementType): 全列挙項目のセットを含む列挙クラス構造
EnumSetの<E>をします( EがE):構造要素のセットを含む
のEnumSetの<E>(E、E1 、E2 E): 2つの要素セットの構造
(E E1のEnumSetの<E> :、E E2、E3 E) 3を含む構造を要素のセット
のEnumSetの<E>(E E1 、E E2、E E3、E E4): 4つの要素からなる構造セット
(E E1のEnumSetの<E> 、E E2、E E3、E E4を、EのE5 ):の構造は、5つの要素の集合含む
(E最初のEnumSetの<E> :、E ...休止) ()可変パラメータを使用して複数の要素の集合を含む構造を
EnumSetの<E> copyOf(EnumSetの<E> S) :構成パラメータは、すべての要素の集合含む
EnumSetの<E> copyOf(コレクション< :E> c)の構造パラメータを含むすべての要素のコレクションを
演算の基本セットとして3.EnumSetそのクラスのメソッドの実装の原理(ビット演算):
説明:
- EnumSetのより
noneOf
とき列挙クラスの列挙、見ることができ少于64
、リターンがあるRegularEnumSet类
()EnumSet的实现类
の目的は、64よりも大きい場合、後で同じクラス使用RegularEnumSetの原理を説明するために、分析目的のために、クラスオブジェクトJumboEnumSetを返します
// EnumSetの#noneOf パブリック 静的 <E延び列挙<E >> EnumSetの<E> noneOf(クラス<E> をelementType){ 列挙 <?> []宇宙= getUniverse(をelementType)。 場合(宇宙== nullが) スロー 新しい ClassCastExceptionが(をelementType + " ではない列挙型" ); もし(universe.length <= 64 ) を返す 新しい RegularEnumSet <> (をelementType、宇宙)。 他の リターン 新しい JumboEnumSet <> (をelementType、宇宙)。 }
- 列挙クラスのテスト
列挙カラー{ RED(" RED " )、 BLUE(" BLUE " )、 YELLOW(" YELLOW " )、 BLACK(" BLACK " )。 文字列の名前。 カラー(文字列名){ この .nameの= 名前。 } @Override パブリック文字列のtoString(){ 戻り 、この.nameのを、 } }
3.1 addメソッド
パブリックブール追加(E、E){ です。TypeCheck(E); 長い oldElements = エレメント。 素子 | =(1L <?> <<((列挙型)E).ordinal())。 返す要素を=!oldElements。 }
ORDINALは()のような、宣言順序によって、0から開始し、列挙した項目のそれぞれのシーケンス番号である[レッド、ブルー、イエロー、ブラック ] [0,1,2,3]に対応し、1L <<((列挙<? )(>)E).ordinal(便宜上、)列挙値として本明細書で言及(e.ordinal()^ 1 * 2を示す )、Color.RED )(ordianlを値1に列挙に対応する、0であります* = 1 2 ^ 0は、実際には、最初の順序(IS)+ 1ビット(右から左へのビット数が1ビットである)進数00000001に対応する十進数0の他に1ビットは、(本明細書中に8ビットであると仮定され、実際の型)は32ビット長であり、
各列挙次のように
列挙数1L <<((列挙<?>)E).ordinal()列挙値
列挙 | いいえ。 | ()1L <<((列挙<?>)e)の.ordinal | 列挙値 |
赤色 | 0 | 00000001 | 1 |
青色 | 1 | 00000010 | 2 |
Color.YELLOW | 2 | 00000100 | 4 |
Color.BLACK | 3 | 00001000 | 8 |
elements |=
これは、合計で付加価値の異なる要素を列挙することにある相同
要素相或
場合を保持不变
3.2 removeメソッド
パブリックブール削除(オブジェクトE){ もし、(E == NULL ) 戻り 偽。 クラスのeclass = <?> e.getClass(); もし(!!のeclass =をelementType && eClass.getSuperclass()= をelementType) のリターン はfalse ; 長い oldElements = エレメント。 要素&=〜(1L <<((列挙<?> )e)の.ordinal()); 返す要素を=!oldElements。 }
以前によると枚举值相加
思考、それは削除からである总枚举值
差し引か待删除元素的枚举值
ので、位运算
直接的な減算、ビット操作はelements &= ~(1L << ((Enum<?>)e).ordinal());
減算操作完了します
3.3は、メソッドが含まれています
パブリックブール(オブジェクトE){含有する 場合(E == NULL ) 戻り 偽を、 クラスのeclass = <?> e.getClass(); もし(!!のeclass =をelementType && eClass.getSuperclass()= をelementType) のリターン はfalse ; リターン(要素&(1L <<((列挙型)E).ordinal())<?>)=!0 ; }
方法は、より良いすべての各列挙するための列挙値の値を理解するために含まれ不一样
、そして相互之间
実行相与
するための操作を0
使用总枚举值
し、要查询的枚举项的枚举值
行う相与
ことがされた場合、動作を0
説明し不存在
、さもなければ、列挙こと存在