2013-06-02 10 views
14

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

つまり、JavaDocは実装に依存していると明言していますが、その内部のサイズはビット単位でlong[]です。それが言うから、1あなたがsize()よりも高いインデックスを持つビットを設定することはできませんと結論できたが、それは本当ではない、BitSetは自動的に成長することができます:

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

BitSetと一つ一つの出会いで私は最後の6年間のJavaプログラミングされているにもかかわらず

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

、2つの方法が非常に常にある:私は1がBitSetの論理サイズを返しますので、私はいつもlength()を使用していた、私の人生でした私を混乱させる。私はしばしばそれらを混ぜて間違ったものを使用します。なぜなら私の頭の中ではBitSetを巧みにSet<boolean>と言います。size()を使用します。

ArrayListlength()の場合は要素数を返し、size()の場合は基本配列のサイズを返します。

今、私が紛失しているsize()メソッドのユースケースはありますか?それはどんな方法でも便利ですか?誰もそれを何のために使ったことがありますか?手作りのビットがつまったり、それと似たようなものがある場合は、重要なのでしょうか? BitSetはJava 1.0で導入された


EDIT私が実現

(いくつかのより多くの研究の後に)我々が使用するクラスのほとんどはコレクションフレームワークは、Java 1.2で導入されました。だから、基本的には、私は、size()は遺産理由のために保管されていると思われ、実際の使用はありません。新しいCollectionクラスにはこのようなメソッドはありませんが、古いコレクションクラス(たとえばVector)の中にはいくつかのメソッドがあります。

答えて

4

BitSetはJava 1.0で導入されましたが、私たちが使用するほとんどのクラスのCollections FrameworkはJava 1.2で導入されました。

正しい。

だから、基本的には、サイズ()は遺産の理由のために保持されており、実際には使用されていないようです。

はい、かなりです。

他の「サイズ」メソッドはlength()で、ビットが設定されている最大のインデックスが得られます。論理的な観点からは、length()size()より有用ですが、length()はJava 1.2でのみ導入されました。あなたは内のビットの反復のため、「フェンスポスト」を確立しようとしている

  • のみ(架空の)私はsize()のときlength()があるよりも良いかもしれない場所を考えることができ、ケースを使用

  • 終了前に反復処理を停止する可能性が高く、
  • 設定されている最後のビットを少し越えても問題ありません。

この場合、安価な呼び出しであるため、size()はおそらくlength()より優れています。 (ソースコードを見てください...)しかし、それはかなり限界です。

(私はここでも、差はわずかである。あなたが新しいBitSetを作成し、既存のBitSetsize()に基づいて、それを事前に割り当てるされている場合も、同様の線に沿って、別のユースケースがあり、推測)しかし、あなたがいます互換性については互換性の問題を発生させずにその意味を変更することはできませんでした。だから彼らはおそらくそれを一人のままにすることに決めました。 APIで特に有用ではないメソッドを使用した場合の「有害」は最小限に抑えられます)。

+0

結局のところ正しい軌道に乗っていたようです。革命的な方法で誰かがこのメソッドを使うともう少しお待ちしていますが、私はダニがあなたのものになると思います。彼らがそれを非難しなかったのは残念です。間違った時間を使うと、貴重な時間を節約できます。 –

0

64の倍数でなければならない0と1の数です.1の数にはカーディナリティ()を使用できます。

+2

私はそれが何をしているのか知っています。しかし、なぜ誰もがこのような方法を呼びたいと思っているのだろうかと思う。または、最初にAPIに含めます。 'BitSet'が古い世代のutilクラスであるという私の前提の通りですか? (私の編集を参照) –

+0

「0と1の数」ではありません。これは、「このビットセットがビット値を表すために実際に使用しているスペースのビット数」です(http://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html#size ())。 – EJP

+1

@EJPこれは明らかかもしれませんが、違いは見られません。 0と1で満たされていないスペースはありますか? –

1

Javaクリエイターによってsizeメソッドが設計されていない場合公衆として、それは間違いなく私的な方法/フィールドとして存在することは間違いない。だから私たちはアクセシビリティについて議論しているかもしれないし、名前をつけるかもしれない。

Java 1.0は、C/C++の手続き構文だけでなく、多くのインスピレーションを受けました。 C++標準ライブラリでは、BitSetの対応語句lengthsizeも存在します。それらはそれぞれsizecapacityと呼ばれます。 C++でcapacityを使用することはほとんどありませんし、Javaのようなガベージコレクション言語でさえそれほど重要ではありませんが、メソッドをアクセス可能にすることは依然として間違いありません。私はJavaの言葉で説明します。

setのように、BitSetの操作を実行するために必要な機械命令の最大数を教えてください。 「ほんの一握り」と答えたいのですが、これは、その特定の操作で基本配列全体の再割り当てが行われない場合にのみ当てはまります。理論的には、再割り当ては、一定の時間アルゴリズムを線形の時間アルゴリズムに変える。

この理論的な違いは実際的な影響がありますか?まれです。アレイは通常、あまり頻繁に成長しません。しかし、最終的にサイズが確定しているアルゴリズムが徐々に増加している場合は、BitSetのコンストラクタに最終サイズを渡すと、再割り当てが不要になります。非常に特殊な状況では、これは顕著な効果を及ぼすことさえあり、ほとんどの状況で傷つくことはありません。

  • setは、アプリケーションをあまりにも長くブロックすることはできません。
  • 一つだけ非常に大きなBitSetインスタンスが(デザインによって)すべての使用可能なメモリを使用している場合は、あなたのJVMが(または余分なコピーなし)の成長操作を実装する方法にdependending後に目立って始めることがスワッピング。

ここでは、すべてがターゲットサイズで割り当てられている多くのBitSetsで操作するとします。あるBitSetインスタンスを別のものから構築していて、それらを並べて使用することがわかっているので、新しいものが古いものの目標サイズを共有するようにします。メソッドsizeを公開すると、これをきちんと実装するのが容易になります。

0

主な理由の1つは、BitSetクラスを拡張してlengthメソッドをオーバーライドする必要があるときです。その場合、サイズは便利です。以下は、lengthメソッドに依存する長さの値を返す方法です。

protected Set bitset; 
public int length() { 
    int returnValue = 0; 
    // Make sure set not empty 
    // Get maximum value +1 
    if (bitset.size() > 0) { 
    Integer max = (Integer)Collections.max(bitset); 
    returnValue = max.intValue()+1; 
    } 
    return returnValue; 
} 
関連する問題