1

Javaでは、100万個程度のフラグtrue/falseの配列を念頭に置いています。助けるべきBitSetですか?を実装していSetますが、配列のように要素を高速に反復することは可能boolean[]ですか?

質問があったらごめんなさい。最初に、配列をバイナリで表されるintとformのチャンクに分割してint[]、それらのバイナリの結果として作成しようとしたので、サイズを32減らすことができましたが、これはかなり低レベルです。

BitSet私は他の場所の批評家を見つけました、そしてそれboolean[]はたくさんの余分なメモリを保存します=>大きな配列には悪いです。

何百万ものフラグを保存するためのより良いアイデアはありますか?

4

5 に答える 5

3

念頭に置いておくべき100万個ほどのフラグtrue/falseの配列があります。BitSetは役に立ちますか?

BitSetには数十億ビットを含めることができます。

Setを実装していますが、配列boolean []であるかのように、その要素を高速に反復することは可能ですか?

boolean []はビットごとに1バイトを使用しますが(ほとんどのJVMで)、BitSetはビットごとに1ビットを使用します。小さな配列の場合、boolean []の方が高速ですが、CPUキャッシュのサイズをテストする場合は、BitSetの方が効率的です。

ところで:ビットセットの使用は、メモリの各ワードからビットを抽出する必要があるため、小さいサイズでは少し遅くなります。Abyte[]にも同じ問題があるため、自分でビットを設定する場合は、int[]BitSetと同じように使用することをお勧めします。


BitSetを使用した例

BitSet bitSet = new BitSet();
// set bit 100
bitSet.set(100);
// get bit 99
System.out.println("bit 99 is " + bitSet.get(99));
System.out.println("bit 100 is " + bitSet.get(100) + " after set");
bitSet.clear(100);
System.out.println("bit 100 is " + bitSet.get(100) + " after clear");

プリント

bit 99 is false
bit 100 is true after set
bit 100 is false after clear
于 2012-08-22T19:05:56.560 に答える
1

単純なものを使用しますboolean[]。また、インターフェースBitSetを実装しないように注意してください。Set

public class BitSet implements Cloneable, java.io.Serializable
于 2012-08-22T19:05:21.177 に答える
1

ちょっと考えてみてください。aのようなものを使用して、HashSet「オン」になっているフラグのインデックスを追加し、「オフ」になったらそれらを削除します。

(これは、ほとんどのフラグがいつでもオフになっている場合に特にうまく機能します)。

于 2012-08-22T19:09:38.683 に答える
0

BitSet操作は非常に効率的です。ソースを自分で調べることができます。は実装されていませんSetが、次のように、単純なサイクルで個々のビットを効率的に反復できます。

int l = bitSet.length();
for(int i = 0; i < l; i++) {
    boolean bit = bitSet.get(i);
    // ...
}

(`BitSet1に対するどのような批判を見つけましたか?他の人が見ることができるように質問にリンクを含めてください。)


管理する必要のある特定の固定ブールフラグのセットがある場合は、それらをにリストしてから、EnumSetenumを使用してフラグ設定を表すことができます。それらの操作も非常に効率的に実行されます。ドキュメントを引用するには:

このクラスの空間と時間のパフォーマンスは、従来のintベースの「ビットフラグ」に代わる高品質でタイプセーフな代替手段として使用できるほど十分に優れている必要があります。バルク操作(containsAllやretainAllなど)でさえ、引数が列挙型セットである場合は非常に高速に実行されるはずです。

また、sと比較した場合の追加の利点としてBitSet、この表現はタイプセーフであり、多くの問題を回避できます。

于 2012-08-22T19:14:40.203 に答える
0

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.htmlから

  • boolean:ブールデータ型には、trueとfalseの2つの可能な値しかありません。このデータ型は、真/偽の状態を追跡する単純なフラグに使用します。このデータ型は1ビットの情報を表しますが、その「サイズ」は正確に定義されたものではありません。

サイズと予測可能性が心配な場合は、8ビットブロックをバイトとして表現してからbyte[]に格納することを検討します。

于 2012-08-22T19:02:06.160 に答える