2010-10-13 21 views
4

我subclass的BitSet類添加一些額外的方法。其中一個被稱爲「摺疊」。 它將BitSet分成兩半,並將它們與「或」組合。 (增加信息密度)調整一個java的位集

這可以工作,但摺疊的BitSet的大小(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); 
    } 

這可能是可行的只返回通過爲每個迭代一個新的較小的一個,但你仍然需要所需長度的新的BitSet,但重新分配它(MyClass的= MyClass的。折())。如果摺疊,則對原始版本沒有興趣。這個想法是節省空間(內存和數據庫)。

有沒有辦法減小當前BitSet的大小? (我沒有看到一個「詭計」)

回答

2

我認爲可以做myClass = myClass.fold(),你不必擔心「節省空間」。

如果對舊對象沒有興趣(即沒有人引用它)無論如何垃圾收集器會爲你清理內存。它針對這些用例進行了很好的優化。

此模式可以在Java庫中的所有不可變類中找到。以str = str.substring(i);bigInt = bigInt.multiply(BigInteger.TEN);等爲例。

+0

謝謝。所以會這樣做。可能早在考慮優化。這些BitSet表示一些內容並用於內存中的搜索。代碼需要能夠輕鬆處理幾個100k。 (創建這些BitSet需要一定的時間,因此它們被存儲在數據庫中,因此可以快速重新加載它們)。 – 2010-10-13 11:04:13

1

的確如此,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; 
}