1。ビットセットとは何ですか?
注:次のコンテンツは、JDK APIからのものです。
ビットセットクラスは、オンデマンドで成長するビットベクトルを実装します。ビットセットの各コンポーネントには、ブール値があります。非陰性整数でビットセットのビットをインデックス化します。各インデックス付きビットは、テスト、設定、またはクリアできます。論理的で論理的または論理的なXOR操作を通じて、1つのビットセットを使用して、別のビットセットのコンテンツを変更できます。
デフォルトでは、セット内のすべてのビットの初期値はfalseです。
各ビットセットには、現在のサイズ、つまりビットセットで使用される現在のスペースのビット数があります。このサイズはビットセットの実装に関連しているため、実装とともに変化する可能性があることに注意してください。ビットセットの長さは、ビットセットの論理長に関連しており、実装とは無関係に定義されています。
ビットセットクラスは、ビット値を保持するための特別なタイプの配列を作成します。ビットセットの配列サイズは、必要に応じて増加します。これは、ビットベクトル(VectorOfbits)に似ています。
これは従来のクラスですが、Java2で完全に再設計されています。
Bitsetは2つのコンストラクターを定義します。
最初のコンストラクターは、デフォルトのオブジェクトを作成します。
BitSet()
2番目の方法により、ユーザーは初期サイズを指定できます。すべてのビットは0に初期化されます。
BitSet(intsize)
2。JavaBitset実装原則
Javaでは、Bitsetの実装はjava.utilパッケージにあります。
パブリッククラスビットセット実装クローン可能、java.io.serializable {private final static int address_bits_bits_per_word = 6; private final static int bits_per_word; private bit_index_mask = bits_per_word -1; 0xfffffffffffffffffl; private static final objectStreamfield [] serialPersistentfields = {new objectStreamfield( "bits"、long []。クラス)、};/***シリアルフィールド「ビット」に対応する内部フィールド。 */private long [] words; .....}ご覧のとおり、ビットセットの基礎となる実装は、内部ストレージ構造として長い配列を使用するため、ビットセットのサイズは長いタイプ(64ビット)のサイズの整数です。
2つのコンストラクターがあります。
1。Bitset():新しいビットセットを作成します。デフォルトサイズは64ビットです。
public bitset(){initwords(bits_per_word); sizeSticky = false;}2。Bitset(int nbits):0からNBITS-1のインデックス範囲でビットを明示的に表すのに十分な初期サイズが十分なビットセットを作成します。
public bitset(int nbits){// nbitsは負にすることはできません。サイズ0はOKです(nbits <0)が新しいnegativearraysizeexception( "nbits <0:" + nbits)を投げる場合。 initwords(nbits); sizeSticky = true; }注記:
1.ビットセットの初期化サイズが指定されている場合、この数の64以上の整数に正規化されます。たとえば、64ビットの場合、ビットセットのサイズは1つの長さですが、65ビットの場合、ビットセットのサイズは2つの長さ、つまり128ビットです。この規制は、主にメモリの調整に関するものであり、特別な状況に対処せず、プログラムを簡素化するという考慮を回避します。
2:ビットセットのサイズ方法:このビットセットを返して、ビット値が64の整数倍である場合に使用される実際のビット数を表します。
長さの方法:このビットセットの「論理サイズ」を返します:ビットセットの最高のセットビットのインデックスは1によって追加されます
3.シナリオを使用します
一般的なアプリケーションシナリオは、ログ分析、ユーザーカウントなど、大規模なデータに関する統計的作業を実施することです。
アリババとのインターンシップインタビューの前に質問されました。1000万件の乱数があり、乱数の範囲は1億から1億の間です。次に、乱数ではない1億から1億の間の数を見つけるためにアルゴリズムを記述する必要がありますか?
コードの例は次のとおりです。
public class alibaba {public static void main(string [] args){random random = new random> list = new arraylist <>(); for(int i = 0; i <10000000; i ++){int randomResult = random.nextint(1000000000); for(int i = 0; i <list.size(); i ++){system.out.println(list.get(i));} bitset bitset = new bitset(100000000); numbers "+bitset.size());要約します
上記は、Java Bitsetの使用シナリオとコード例について議論しているこの記事についてのすべてです。私はそれがすべての人に役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!