调整Java BitSet的大小

4

我继承了BitSet类并添加了一些额外的方法。其中之一被称为“fold”。它将BitSet分成两半并使用或运算符“组合”它们。(增加信息密度)

这个方法可以正常工作,但是折叠后的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大小的方法?(我没有看到任何“技巧”?)

2个回答

2
我认为可以执行myClass = myClass.fold(),不需要担心“节省空间”的问题。
如果旧对象没有被引用(即没有人引用它),垃圾收集器会自动清理内存。它对这些用例进行了优化。
这种模式在Java库中的所有不可变类中都可以找到。例如,str = str.substring(i);bigInt = bigInt.multiply(BigInteger.TEN);等。

谢谢。那就这么做吧。可能之前想得太早了一些优化问题。这些BitSets表示某个东西,并用于内存搜索。代码需要能够轻松处理几十万个。 (创建这些BitSets需要一定时间,因此它们被存储在DB中,以便可以快速重新加载)。 - beginner_

1

确实,您是正确的,clear方法将清除所有位,但不会释放用于保存位的任何内部内存。

值得一提的是:如果您查看BitSet的源代码。位被保存在一个名为words的内部数组中。这个数组唯一缩小的地方是在私有的trimToSize()方法中。这又只从clone()writeObject()调用,但仅当大小不是粘性时——即如果没有通过调用BitSet(int nbits)构造函数创建BitSet

您建议的创建新的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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接