4

我对 BitSet 类进行了子分类以添加一些额外的方法。其中之一称为“折叠”。它将 BitSet 分成两半,并用 or 将它们“组合”起来。(增加信息密度)

这可行,但折叠的 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 可能是可行的,但只能通过为每次迭代创建一个新的较小的 BitSet,但您仍然需要重新分配它(myClass = myClass.fold())。如果你弃牌,对原始版本没有兴趣。这个想法是为了节省空间(内存和数据库)。

有没有办法减小当前 BitSet 的大小?(我没看到的“技巧”?)

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()and调用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;
}
于 2010-10-13T09:25:42.057 回答