16

クラスのsize()メソッドのユースケースはありますか?java.util.BitSet

つまり、JavaDoc は実装に依存していると明確に述べており、内部long[]ストレージのサイズをビット単位で返します。それが言っていることから、より高いインデックスでビットを設定することはできないと結論付けることができますが、それsize()は真実ではありません.BitSetは自動的に成長する可能性があります:

BitSet myBitSet = new BitSet();
System.out.println(myBitSet.size());    // prints "64"
myBitSet.set(768);
System.out.println(myBitSet.size());    // prints "832"

私が人生で経験したすべての出会いでBitSet、私は常に使用したいと思っていました。これlength()は、の論理サイズを返すためですBitSet

BitSet myBitSet = new BitSet();
System.out.println(myBitSet.length());    // prints "0"
myBitSet.set(768);
System.out.println(myBitSet.length());    // prints "769"

過去 6 年間 Java をプログラミングしてきましたが、この 2 つの方法は常に非常に混乱します。私はしばしばそれらを混同して、ついでに間違ったものを使用してBitSetしまいSet<boolean>ますsize()

要素の数を返し、基になる配列のサイズをArrayList返すようなものです。length()size()

さて、size()私が見逃しているメソッドのユースケースはありますか? それは何らかの形で役に立ちますか?何かに使ったことある人いますか?手動でビットをいじったり、同様のことをしたりするのに重要でしょうか?


編集(さらに調査した後)

は Java 1.0BitSetで導入されましたが、私たちが使用するほとんどのクラスを含むコレクション フレームワークは Java 1.2 で導入されました。size()したがって、基本的には、レガシーの理由で保持されているように思われ、実際には使用されません。新しい Collection クラスにはそのようなメソッドがありませんが、一部の古いもの (Vectorなど) にはあります。

4

4 に答える 4

6

BitSet は Java 1.0 で導入されましたが、私たちが使用するほとんどのクラスを含むコレクション フレームワークは Java 1.2 で導入されました。

正しい。

したがって、基本的には、 size() は従来の理由で保持されており、実際には使用されていないように思えます。

はい、かなり。

もう1つの「サイズ」メソッドはlength()、ビットが設定される最大のインデックスを提供するものです。論理的な観点からは...length()よりも便利ですが、Java 1.2 でのみ導入されました。size()length()

私が考えることができる唯一の(仮説的な)ユースケースは、いつsize()よりも優れているかもしれませんlength()

  • セット内のビットの繰り返しのための「フェンス ポスト」を確立しようとしています。
  • 終了前に反復を停止する可能性が高く、
  • 設定されている最後のビットを少し超えても問題ありません。

その場合、通話料が安いため、size()間違いなく優れています。length()(ソースコードを見てください...)しかし、それはかなり限界です。

(同様の線に沿った別のユースケースは、既存の のBitSetに基づいて新しい を作成し、事前に割り当てる場合です。ここでも、違いはわずかです。)size()BitSet

しかし、互換性については正しいです。size()互換性の問題を引き起こさずにそのセマンティクスを取り除くことも、変更することもできないことは明らかです。そのため、彼らはおそらくそれを放っておくことにしました。(実際、彼らはそれを非推奨にする必要性さえ認識していませんでした。API で特に有用でないメソッドを使用することによる「害」は最小限です。)

于 2013-06-02T10:13:14.963 に答える