質問
いくつかの追加方法を追加するために、ビットセットクラスを分類しました。その1つは「フォールド」と呼ばれます。ビットセットを2つの半分に分割し、ORと「結合」します。 (情報密度を高める)
これは機能しますが、折り畳まれたビットセットのサイズ(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)を節約することです。
現在のビットセットのサイズを縮小する方法はありますか? (私が見ていない「トリック」?)
解決
大丈夫だと思います myClass = myClass.fold()
, 、「スペースを節約する」ことを心配する必要はありません。
古いオブジェクトに興味がない場合(つまり、誰もそれを参照していません) ゴミコレクターはあなたのために記憶をきれいにします とりあえず。この種のユースケースに適切に最適化されています。
このパターンは、Javaライブラリのすべての不変のクラスにあります。たとえば、 str = str.substring(i);
また bigInt = bigInt.multiply(BigInteger.TEN);
等
他のヒント
確かにあなたは正しいです、 clear
メソッドはすべてのビットをクリアしますが、ビットを保持するために使用される内部メモリは放出されません。
それが価値があるもののために:あなたがのソースコードを見るなら BitSet
. 。ビットは、呼ばれる内部配列に保持されます words
. 。この配列がダウンサイズである唯一の場所はプライベートです trimToSize()
方法。これは順番に呼び出されます clone()
と writeObject()
, 、しかし、サイズがある場合にのみ いいえ スティッキー - つまり、 BitSet
電話することによって作成されたものではありません BitSet(int nbits)
コンストラクタ。
新しいものを作成するというあなたの提案されたアプローチ BitSet
そして、それを再割り当てすることは完全に大丈夫です。とにかく元のバージョンはゴミが収集されます。変更された方法は次のようになります。
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;
}