0

ここでの Java リファレンスは、ブール型は「ビット」の情報で表されますが、正確に定義されたサイズを持たないことを示しています。対照的に、他のタイプは、サイズが定義されていることを示唆しているようです。たとえば、intは 32 ビットであり、話は終わりです。

BitSetの仕様を見ると、ブール値で構成されていることがわかります。上記の参照によると、これはBitSetの「サイズ」が定義されていないことを示唆しているようです。結局のところ、ブール値で構成されています。案の定、ドキュメントには次のように指定されています。

サイズはビット セットの実装に関連するため、実装によって変わる可能性があることに注意してください。

私の質問は、正確に定義された別のデータ型を使用してBitSetを実装しないのはなぜですか? たとえば、1 バイトを使用する場合、8 ビットのサイズを保証でき、サイズが思ったものと異なる可能性があるというあいまいな感覚はありません。サイズが 8 で割り切れる必要があるのは事実ですが、少なくともこの方法の方がサイズが決定論的であるように見えます。

特定のメモリ容量を絶対に超えることができないシステムがある場合、サイズに関して正確なBitSet実装を使用すると便利です。

4

5 に答える 5

1

ほとんどのプリミティブとは異なり、Javaオブジェクトのバイトサイズは明確に定義されておらず、実装に依存するか、JITコンパイルやJVMが内部で使用するさまざまなトリックのためにアプリケーションの実行時に変更される可能性があります。booleanSun JVMリリース間(4バイトと1バイト)でもaのサイズが変更されており、誤解しない限り、シングルbooleanが4バイト、Nの配列がbooleans約N*1バイトかかることもありました。 (またはおそらくそれはbyteタイプでしたか?)とにかく、変数の論理サイズまたはその情報容量は、JVMによって割り当てられた物理メモリとは完全に異なる場合があります。

BitSet概念的にのみブール値で構成され、実装は論理レイアウトに従う必要はありません。実際、ほとんどの実装では、バイト配列をBitSet使用し、各値に約1ビットのみを使用します(ただし、値を大きくするための余裕と追加のハウスキーピングデータがあります)。

于 2012-04-12T14:26:02.433 に答える
1

ポイントの一部はBitSet、その長さが概念的に無限であるということです。つまり、任意の数のビットを操作できるということです。セマンティクスほど気にするのはメモリ消費ではなく、メモリ消費sizeの指標にすぎません。

于 2012-04-12T14:15:26.173 に答える