Изменение размера Java BitSet - PullRequest
4 голосов
/ 13 октября 2010

Я подклассифицировал класс 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);
    }

Вероятно, выполнимо вернуть новый битовый набор желаемой длины, но только путем создания нового меньшего набора для каждой итерации, но вам все равно придется переназначить его (myClass = myClass.fold ()). Если вы сбрасываете, нет никакой заинтересованности в оригинальной версии. Идея состоит в том, чтобы сэкономить место (память и БД).

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

Ответы [ 2 ]

2 голосов
/ 13 октября 2010

Я думаю, что все в порядке myClass = myClass.fold(), вам не нужно беспокоиться о "экономии места".

Если нет интереса к старому объекту (т. Е. Никто не ссылаетсяэто) сборщик мусора очистит память для вас в любом случае.Он хорошо оптимизирован для таких случаев использования.

Этот шаблон встречается во всех неизменяемых классах в библиотеке Java.Возьмите например str = str.substring(i); или bigInt = bigInt.multiply(BigInteger.TEN); и т. Д.

1 голос
/ 13 октября 2010

Действительно, вы правы, метод 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;
}
...