4

BitSetクラスをサブクラス化して、いくつかのメソッドを追加しました。その1つは「フォールド」と呼ばれます。BitSetを2つに分割し、それらをまたはで「結合」します。(情報密度を高める)

これは機能しますが、折りたたまれたビットセットのサイズ(1024)は元のサイズのままです。

コード:

    BitSet firstHalf;
    BitSet secondHalf;
    for(int i = nrOfTimes; i > 0; i-- ){
        firstHalf = this.get(0, this.size()/2);
        secondHalf = this.get(this.size()/2, this.size());
        firstHalf.or(secondHalf);
        this.clear();
        this.or(firstHalf);
    }

希望する長さの新しいビットセットを返すことはおそらく実行可能ですが、反復ごとに新しい小さいビットセットを作成することによってのみ可能ですが、それでも再割り当てする必要があります(myClass = myClass.fold())。折りたたむと元のバージョンには興味がありません。アイデアは、スペース(メモリとDB)を節約することです。

現在のビットセットのサイズを減らす方法はありますか?(私が見ていない「トリック」?)

4

2 に答える 2

2

「スペースの節約」を気myClass = myClass.fold()にする必要はありません。

古いオブジェクトに関心がない場合(つまり、誰もそのオブジェクトへの参照を持っていない場合)、ガベージコレクターはとにかくメモリをクリーンアップします。この種のユースケースに最適化されています。

このパターンは、Javaライブラリのすべての不変クラスに見られます。たとえばstr = str.substring(i);bigInt = bigInt.multiply(BigInteger.TEN);など。

于 2010-10-13T09:05:57.393 に答える
1

確かにあなたは正しいです、clearメソッドはすべてのビットをクリアしますが、ビットを保持するために使用された内部メモリを解放しません。

価値があるものについて:のソースコードを見るとBitSet。ビットは、と呼ばれる内部配列に保持されwordsます。この配列がダウンサイズされる唯一の場所は、プライベートtrimToSize()メソッドです。clone()これは、とからのみ呼び出されますがwriteObject()、サイズが固定されていない場合、つまり、コンストラクターBitSetを呼び出して作成されていない場合に限りBitSet(int nbits)ます。

新しいものを作成して再割り当てするというあなたの提案するアプローチBitSetは完全にOKです。元のバージョンはとにかくガベージコレクションされます。変更されたメソッドは次のようになります。

public static BitSet fold(BitSet bs, int nrOfTimes)
{
    BitSet temp;
    while (nrOfTimes-- > 0)
    {
        temp = bs.get(0, bs.size()/2);
        temp.or ( bs.get(bs.size()/2, bs.size()) );
        bs.clear();
        bs.or(temp);
    }
    return temp;
}
于 2010-10-13T09:25:42.057 に答える