詳細EnumSetののコレクションを設定されたJavaのコレクション(B)

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

方法は、より良いすべての各列挙するための列挙値の値を理解するために含まれ不一样、そして相互之间実行相与するための操作を使用总枚举值し、要查询的枚举项的枚举值行う相与ことがされた場合、動作を説明し不存在、さもなければ、列挙こと存在

 

 

おすすめ

転載: www.cnblogs.com/yuexiaoyun/p/12078048.html