Изменение размера Java BitSet

Я подклассифицировал класс BitSet, чтобы добавить некоторые дополнительные методы. Один из них называется "сложить". Он разбивает BitSet на 2 половины и "комбинирует" их с или. (увеличивает плотность информации)

Это работает, но размер сложенного 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.fold()). Если вы сбрасываете, нет интереса к оригинальной версии. Идея состоит в том, чтобы сэкономить место (память и БД).

Есть ли способ уменьшить размер текущего BitSet? ("трюк" я не вижу?)

2 ответа

Решение

Я думаю это нормально делать 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;
}
Другие вопросы по тегам