Действительно, вы правы, метод clear
удалит все биты, но не освободит внутреннюю память, используемую для хранения битов.
Для чего это стоит: если вы посмотрите на исходный код BitSet
. Биты хранятся во внутреннем массиве с именем words
. Единственное место, где этот массив имеет уменьшенный размер, это приватный метод trimToSize()
. Это, в свою очередь, вызывается только из clone()
и writeObject()
, но только если размер не sticky - т.е. если 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;
}