-1

Java:ブール配列とBitSetの違いは?

BitSet のドキュメントによると、

このクラスは、必要に応じて成長するビットのベクトルを実装します。ビット セットの各コンポーネントにはブール値があります。」

これは、BitSet() 配列と boolean[] 配列の違いは何だと思いますか?

1)メモリに割り当てられたスペースの量に違いはありますか?

サイズが 1,000 万のブール配列とビットセットの両方を作成した場合のメモリ割り当ての違いは何ですか

2) どちらが速いですか?

4

2 に答える 2

3

a のドキュメントはBitSet、実装が必ずしも実際のブール配列ではないことを明確に示しています。特に:

すべてのビット セットには現在のサイズがあります。これは、ビット セットによって現在使用されているスペースのビット数です。サイズはビット セットの実装に関連するため、実装によって変わる可能性があることに注意してください。ビット セットの長さは、ビット セットの論理長に関連し、実装とは別に定義されます。

Java ライブラリ クラスのソースは公開されており、自分で簡単に確認できます。特に:

The internal field corresponding to the serialField "bits".
89 
90     private long[] words;

速度に関しては; プロファイリングします。それはあなたが何をしているかによります。一般に、事前に速度について考えないでください。意味的に最も意味があり、最も明確なコードにつながるツールを使用してください。パフォーマンス要件が満たされていないことを確認し、ボトルネックを特定してから最適化してください。

いずれにせよ、明らかに、boolean 配列の値への直接アクセスは、long 配列のビットを見つけるよりも高速であると思いますが、2 つの long 値に対してビットごとの OR を実行する方が、64 に対して論理 OR を実行するよりも高速です。ブール値。少し考えてみてください。例えば:

613     public boolean get(int bitIndex) {
614         if (bitIndex < 0)
615             throw new IndexOutOfBoundsException("bitIndex < 0: " + bitIndex);
616 
617         checkInvariants();
618 
619         int wordIndex = wordIndex(bitIndex);
620         return (wordIndex < wordsInUse)
621             && ((words[wordIndex] & (1L << bitIndex)) != 0);
622     }

その他の違いとしては、明らかに API が異なります。BitSet使用する必要がある可能性がある多くのビット操作を提供します。boolean配列は配列です。最適な方法は、特定のアプリケーション要件によって異なります。

于 2013-11-05T12:02:03.147 に答える
0

メモリの違いは 8 倍になるはずです。

2 番目の質問:何をするのが速いですか?

于 2013-11-05T11:56:09.247 に答える